urljoin当绝对路径没有前导斜杠时

时间:2014-11-05 19:39:07

标签: python url url-parsing urlparse

http://www.gilacountyaz.gov/government/assessor/index.php这样的网站有一堆内部链接应该是绝对路径,但没有前导斜杠。使用urlparse.urljoin解析它们时,结果如下:

>>> import urlparse
>>> a = "http://www.gilacountyaz.gov/government/assessor/index.php"
>>> b = "government/assessor/address_change.php"
>>> urlparse.urljoin(a, b)
'http://www.gilacountyaz.gov/government/assessor/government/assessor/address_change.php'

这会导致网络抓取工具无法实现已访问过的页面,并且可能存在无限循环。 Firefox和Chrome能够发现问题并正确解析

http://www.gilacountyaz.gov/government/assessor/address_change.php

有没有办法在Python中做同样的事情?请注意,假设始终使用前导斜杠不起作用,因为我们可能正在处理真正的相对路径。

2 个答案:

答案 0 :(得分:7)

链接页面包含以下内容:

<head>
  <base href="http://www.gilacountyaz.gov/index.php"/>
</head>

如果您使用该网址作为urljoin的第一个参数,您将获得正确的结果。此标记允许您的浏览器正确解释这些链接。

答案 1 :(得分:3)

Firefox和Chrome都在阅读页面顶部的<base>标记:

<base href="http://www.gilacountyaz.gov/index.php"/>

您的代码需要将其用作root:

>>> import urlparse
>>> a = "http://www.gilacountyaz.gov/index.php"
>>> b = "government/assessor/address_change.php"
>>> urlparse.urljoin(a, b)
'http://www.gilacountyaz.gov/government/assessor/address_change.php'