Python urlparse: небольшая проблема - PullRequest
2 голосов
/ 06 ноября 2010

Я создаю приложение, которое анализирует HTML и получает изображения из него. С парсингом Beautiful Soup и загрузкой html легко разбирать, а изображения работают и с urllib2.

У меня проблема с urlparse, чтобы сделать абсолютные пути из относительных. Проблема лучше всего объясняется на примере:

>>> import urlparse
>>> urlparse.urljoin("http://www.example.com/", "../test.png")
'http://www.example.com/../test.png'

Как видите, urlparse не убирает ../ прочь. При попытке загрузить изображение возникает проблема:

HTTPError: HTTP Error 400: Bad Request

Есть ли способ исправить эту проблему в urllib?

Ответы [ 4 ]

3 голосов
/ 06 ноября 2010

".." приведет вас к одному каталогу ("." Является текущим каталогом), поэтому объединять его с URL-адресом доменного имени не имеет большого смысла.Может быть, вам нужно:

>>> urlparse.urljoin("http://www.example.com","./test.png")
'http://www.example.com/test.png'
2 голосов
/ 06 ноября 2010

Я думаю, что лучшее, что вы можете сделать, - это предварительно проанализировать исходный URL и проверить компонент пути. Простой тест -

if len(urlparse.urlparse(baseurl).path) > 1:

Затем вы можете объединить это с индексированием, предложенным demas. Например:

start_offset = (len(urlparse.urlparse(baseurl).path) <= 1) and 2 or 0
img_url = urlparse.urljoin("http://www.example.com/", "../test.png"[start_offset:])

Таким образом, вы не будете пытаться перейти к родителю корневого URL.

1 голос
/ 07 ноября 2010

Если вы хотите, чтобы /../test означало то же самое, что и /test как пути в файловой системе, тогда вы можете использовать normpath():

>>> url = urlparse.urljoin("http://example.com/", "../test")
>>> p = urlparse.urlparse(url)
>>> path = posixpath.normpath(p.path)
>>> urlparse.urlunparse((p.scheme, p.netloc, path, p.params, p.query,p.fragment))
'http://example.com/test'
0 голосов
/ 06 ноября 2010
urlparse.urljoin("http://www.example.com/", "../test.png"[2:])

Это то, что вам нужно?

...