Python - 在重写URL时确定正确的基本URL

时间:2012-09-26 06:40:50

标签: python url-rewriting web-scraping base-url

我找到完整网址的常用方法是:

resp = urllib.request.urlopen('http://www.example.com')
base_url = resp.geturl()
# find the wanted (relative) url in the resp by using BeautifulSoup4
full_url = urljoin(base_url, relative_url)

但是,对于某些网站,例如http://www.titanquest.net/tq-forum/forums/72-Underlord,base_url和full_url都是错误的,因为url会被重写(我假设),如下所示:

>>> full_url
'http://www.titanquest.net/tq-forum/forums/72-Underlord'
>>> relative_url
'threads/43456-Epic-items?s=26260c54fd856499bff7a57e3c7ceb94'
>>> urljoin(full_url, relative_url)
'http://www.titanquest.net/tq-forum/forums/threads/43456-Epic-items?s=26260c54fd856499bff7a57e3c7ceb94'

正确的网址应为:

http://www.titanquest.net/tq-forum/threads/43456-Epic-items?s=26260c54fd856499bff7a57e3c7ceb94

我的问题是如何生成正确的base_url,因此也就是full_url。

1 个答案:

答案 0 :(得分:2)

您的浏览器通常确实使用当前页面的位置作为相对URL的基础,并且您使用urljoin可以正确模拟该行为。

但是,如果返回的HTML包含<base /> tag,则浏览器会使用该标记命名的网址作为解析相对网址的基础。 <base />标记是HTML头的一部分。

您需要解析http://www.titanquest.net/tq-forum/forums/72-Underlord的响应以确定是否存在此类标记,然后使用值而不是页面的URL来确定相对URL 。 <base href="link" />链接值本身可能是相对的,在这种情况下,您必须首先根据文档位置设置绝对值。

在这种特殊情况下,网页包含<base />标记:

<base href="http://www.titanquest.net/tq-forum/" /><!--[if IE]></base><![endif]-->