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
.)
【讨论】:
如果文档中有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库的使用