Python - 当 url 可能被重写时确定正确的基本 url

标签 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。

最佳答案

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

但是,如果返回的 HTML 包含 <base /> tag ,浏览器使用该标签命名的 url 作为解析相对 URL 的基础。 <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]-->

关于Python - 当 url 可能被重写时确定正确的基本 url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12595931/

相关文章:

python字典难题

python - python中按关键字拆分列表

用于附加任意类对象列表属性的 Pythonic 语法

url-rewriting - 没有文件扩展名的网站网址?

c# - 从 C# 执行 Python 脚本

php - 排列、跳过和 URL 重写

iOS 在特定路径重写图像文件显示旧图像

python - 访问 python for 循环值

python - Scraper Python和YouTube API

selenium - 是否可以使用 Selenium WebDriver 来驱动 PhantomJS?