Python urlparse:小问题

时间:2010-11-06 17:25:37

标签: python urllib2 urlparse

我正在创建一个解析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 个答案:

答案 0 :(得分:3)

“..”会为您带来一个目录(“。”是当前目录),因此将其与域名url相结合并没有多大意义。也许你需要的是:

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

答案 1 :(得分:2)

我认为您可以做的最好的事情是预先解析原始网址,然后检查路径组件。一个简单的测试是

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的父级。

答案 2 :(得分: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 :(得分:0)

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

这是你需要的吗?