BeautifulSoup 和 lxml.html - 更喜欢啥? [复制]

Posted

技术标签:

【中文标题】BeautifulSoup 和 lxml.html - 更喜欢啥? [复制]【英文标题】:BeautifulSoup and lxml.html - what to prefer? [duplicate]BeautifulSoup 和 lxml.html - 更喜欢什么? [复制] 【发布时间】:2011-06-25 10:10:33 【问题描述】:

我正在做一个涉及解析 html 的项目。

四处搜索后,我发现了两个可能的选项:BeautifulSoup 和 lxml.html

有什么理由更喜欢其中一个吗?前段时间我曾将 lxml 用于 XML,我觉得我会更适应它,但是 BeautifulSoup 似乎很常见。

我知道我应该使用适合我的那个,但我正在寻找两者的个人经验。

【问题讨论】:

【参考方案1】:

imo,简单的答案是,如果您相信您的源格式正确,请使用 lxml 解决方案。否则,BeautifulSoup 一路走来。

编辑:

这个答案现在已经三年了;值得注意的是,正如 Jonathan Vanasco 在 cmets 中所做的那样,BeautifulSoup4 现在支持使用 lxml 作为内部解析器,因此如果您愿意,您可以使用 BeautifulSoup 的高级功能和界面而不会影响大部分性能(尽管我自己仍然直接联系lxml——也许这只是习惯的力量:))。

【讨论】:

我明白了。我将只使用 lxml,我的 HTML 来自一个强大的网站,所以我可以(希望)依赖它来形成良好的格式。 根据我的经验,lxml.html 可以很好地处理格式错误的 html。 @Steven:所以你也推荐lxml.html而不是BeautifulSoup 是的,如果您已经熟悉 lxml,并且您没有“纯 python”要求(如在 Google Appengine 上),我当然愿意。就个人而言,我在处理带有 lxml.html 的页面时没有任何问题(相反,我已经能够处理给 Beautifulsoup 带来问题的页面),除非我必须明确提供正确的字符编码(因为 lxml “信任”不正确的 http 标头/html 元标记)。另请注意,ElementSoup 允许 lxml.html 在必要时使用 BeautifulSoup 解析器) 这个问题是由于最近的一次编辑而弹出的。我只是不想BeautifulSoup4 支持使用lxml 作为底层解析器——所以现在你基本上可以几乎获得 lxml 的速度(只是一个小打击)以及 BeautifulSoup 的所有好处.【参考方案2】:

总而言之,lxml 被定位为闪电般快速的生产质量 html 和 xml 解析器,顺便说一下,它还包括一个 soupparser 模块以依赖于 BeautifulSoup 的功能。 BeautifulSoup 是一个单人项目,旨在节省您从格式不佳的 html 或 xml 中快速提取数据的时间。

lxml documentation 表示两种解析器都有优点和缺点。出于这个原因,lxml 提供了一个soupparser,因此您可以来回切换。引用,

BeautifulSoup 使用不同的解析方法。它不是真正的 HTML 解析器,但使用正则表达式来浏览标签汤。它是 因此在某些情况下更宽容,而在其他情况下则不太好。它是 lxml/libxml2 更好地解析和修复损坏的 HTML 并不少见, 但是 BeautifulSoup 对编码检测有卓越的支持。 它 很大程度上取决于哪个解析器工作得更好。

最后他们说,

使用这个解析器的缺点是它慢得多 lxml 的 HTML 解析器。 因此,如果性能很重要,您可能需要 考虑仅在某些情况下将 soupparser 用作后备。

如果我理解正确,这意味着汤解析器更强大——它可以通过使用正则表达式来处理格式错误的标签的“汤”——而lxml 更简单,只解析事物并按照您的预期构建一棵树。我认为它也适用于BeautifulSoup 本身,而不仅仅是lxmlsoupparser

他们还展示了如何从BeautifulSoup 的编码检测中受益,同时仍然使用lxml 快速解析:

>>> from BeautifulSoup import UnicodeDammit

>>> def decode_html(html_string):
...     converted = UnicodeDammit(html_string, isHTML=True)
...     if not converted.unicode:
...         raise UnicodeDecodeError(
...             "Failed to detect encoding, tried [%s]",
...             ', '.join(converted.triedEncodings))
...     # print converted.originalEncoding
...     return converted.unicode

>>> root = lxml.html.fromstring(decode_html(tag_soup))

(同一来源:http://lxml.de/elementsoup.html)。

BeautifulSoup的创建者的话来说,

就是这样!玩得开心!我写了美丽的汤来节省大家的时间。 一旦你习惯了它,你应该能够把数据从 设计不佳的网站只需几分钟。如果你给我发电子邮件 有任何 cmets,遇到问题,或希望我了解您的 使用 Beautiful Soup 的项目。

 --Leonard

引自Beautiful Soup documentation。

我希望现在已经清楚了。 The soup 是一个出色的单人项目,旨在节省您从设计不佳的网站中提取数据的时间。目标是立即为您节省时间,完成工作,不一定是长期节省时间,也绝对不是优化软件的性能。

另外,来自lxml website,

lxml 已经从 Python Package Index 下载了两个以上 百万次,也可直接以多种包装形式提供 分布,例如适用于 Linux 或 MacOS-X。

还有,来自Why lxml?,

C 库 libxml2 和 libxslt 具有巨大的优势:... 符合标准...功能齐全...速度快。快速地!快速地! ... lxml 是 libxml2 和 libxslt 的新 Python 绑定...

【讨论】:

【参考方案3】:

两者都用? lxml 用于 DOM 操作,BeautifulSoup 用于解析:

http://lxml.de/elementsoup.html

【讨论】:

“解析”是什么意思?我问这个是因为,恕我直言,解析与在 DOM 上执行操作相同。【参考方案4】:

lxml 很棒。但是,只有当 dom 结构确实可以帮助您找到所需内容时,将您的输入解析为 html 才有用。

你可以使用普通的字符串函数或正则表达式吗?对于许多 html 解析任务,将您的输入视为字符串而不是 html 文档会更容易违反直觉。

【讨论】:

“更容易”,也许——但无论如何都不强大。输入 HTML 中的格式更改(换行、空格、元素编码等)非常容易破坏手动开发的“解析器”。如果你想构建一些东西来解析你无法控制的输入,或者将来可能会改变,那么使用真正的 HTML 解析器是正确的。 @dfichter 你又做了一次。你说的是难以言喻的;你已经通过同时跨越 html 和正则表达式说出了邪恶的咒语。你肯定wandered into the mouth of madness as so many poor souls before you。

以上是关于BeautifulSoup 和 lxml.html - 更喜欢啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

BeautifulSoup:“lxml”、“html.parser”和“html5lib”解析器有啥区别?

Python BeautifulSoup 相当于 lxml make_links_absolute

python学习(25) BeautifulSoup介绍和实战

Python爬虫五 BeautifulSoup库

从 HTML 标记中提取文本? [复制]

beautifhulsoup4的使用