Python urlparse:小问题

2 投票
4 回答
2257 浏览
提问于 2025-04-16 06:40

我正在制作一个应用程序,用来解析HTML并从中获取图片。使用Beautiful Soup来解析HTML很简单,下载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 个回答

1

如果你希望 /../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'
3

“..”可以让你回到上一级目录(“.”代表当前目录),所以把这个和一个域名网址放在一起就没什么意义了。也许你需要的是:

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

我觉得最好的办法是先解析一下原始的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的上级了。

撰写回答