Python BeautifulSoup 相当于 lxml make_links_absolute

Posted

技术标签:

【中文标题】Python BeautifulSoup 相当于 lxml make_links_absolute【英文标题】:Python BeautifulSoup equivalent to lxml make_links_absolute 【发布时间】:2011-05-26 23:41:39 【问题描述】:

所以lxml有一个很手的功能:make_links_absolute:

doc = lxml.html.fromstring(some_html_page)
doc.make_links_absolute(url_for_some_html_page)

现在 doc 中的所有链接都是绝对的。 BeautifulSoup 中是否有一个简单的等价物,或者我只需要通过 urlparse 传递它并对其进行规范化:

soup = BeautifulSoup(some_html_page)
for tag in soup.findAll('a', href=True):
    url_data = urlparse(tag['href'])
    if url_data[0] == "":
        full_url = url_for_some_html_page + test_url

【问题讨论】:

我对lxml不熟悉,但是URL的规范化并不是那么容易。你真的想规范化它们还是只让它们绝对化? 【参考方案1】:

在我对What is a simple way to extract the list of URLs on a webpage using python? 的回答中,我在提取步骤中顺便提到了这一点;你可以很容易地在汤上写一个方法来做,而不仅仅是提取它。

from urllib.parse import urljoin

def make_links_absolute(soup, url):
    for tag in soup.findAll('a', href=True):
        tag['href'] = urljoin(url, tag['href'])

(Python 2:from urlparse import urljoin.)

【讨论】:

如果文档中有 会不会失败?参见例如HTML base tag,由lxml处理(lxml.de/lxmlhtml.html) 当然;如果需要,您可以获取base 标签并对其进行解析并使用urljoin(url, base) 而不是url。就我自己而言,我几乎从未见过它在网络上使用过,而且我永远不会使用base 标签(至少在几年内都不会使用,尽管即便如此我敢说我也不会使用它)因为它在 IE8 中不起作用。 我想你的意思是urljoin(base, tag['href'])。我听说 base 的使用很常见,例如typo3 sites 我用过它,例如归档页面时。我听说ie8 bugs 已修复 - 你知道不同吗?无论如何,我只是想澄清一下拥有一个像 lxml 一样工作的 Python 方法需要什么。 @nealmcb:不,我是认真的。这样,无论有没有<base>,它都可以继续工作。 (再想一想;应该将基本标记解释为相对于页面 URL。)关于 IE8 错误,我没有听说它已被修复。我只知道它,因为我爸爸试图在本地文件上使用 <base> 并且它实际上不起作用(不仅仅是像暗示的那样延迟它);短暂的狩猎表明这可能是一个不同的问题。出于这个原因,他不得不放弃使用基本标签。 啊——我明白你的意图了。但是这样做是没有意义的,因为基本 href 必须是绝对的:12.4 路径信息:BASE 元素 - 此属性指定一个绝对 URI,作为解析相对 URI 的基本 URI来自w3.org/TR/html4/struct/links.html#h-12.3.1

以上是关于Python BeautifulSoup 相当于 lxml make_links_absolute的主要内容,如果未能解决你的问题,请参考以下文章

Python网络爬虫——BeautifulSoup4库的使用

Python 爬虫实战:使用 requests 和 BeautifulSoup

[技术博客] BeautifulSoup4分析网页

[技术博客] BeautifulSoup4分析网页

Python3 爬虫Beautiful Soup库的使用

python虚拟环境简单介绍