像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中做同样的事情?请注意,假设始终使用前导斜杠不起作用,因为我们可能正在处理真正的相对路径。
答案 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'