Python urlparse:小问题
我正在制作一个应用程序,用来解析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的上级了。