lxml 和 libxml2 哪个更适合在 Python 中解析格式错误的 html?

Posted

技术标签:

【中文标题】lxml 和 libxml2 哪个更适合在 Python 中解析格式错误的 html?【英文标题】:Which of lxml and libxml2 is better for parsing malformed html in Python? 【发布时间】:2012-03-08 14:59:52 【问题描述】:

对于格式错误的 html,哪一个更好、更有用? 我找不到如何使用 libxml2。

谢谢。

【问题讨论】:

【参考方案1】:

在libxml2 page你可以看到这个注释:

请注意,一些 Python 纯粹主义者不喜欢默认的 Python 绑定集,而不是抱怨,我建议他们查看 lxml,了解 libxml2 和 libxslt 的更多 Pythonic 绑定,并检查邮件列表。

在lxml 页面中还有另一个:

lxml XML 工具包是 C 库 libxml2 和 libxslt 的 Pythonic 绑定。它的独特之处在于它将这些库的速度和 XML 功能完整性与原生 Python API 的简单性结合在一起,大部分兼容但优于众所周知的 ElementTree API。

所以本质上,使用lxml,您可以获得完全相同的功能, 但是使用与标准库中的ElementTree 库兼容的pythonic API(因此这意味着标准库文档将有助于学习如何使用lxml)。这就是为什么lxml 优于libxml2 的原因(即使底层实现相同)。

编辑:话虽如此,正如其他答案所解释的那样,解析格式错误的 html 您最好的选择是使用BeautifulSoup。需要注意的一件有趣的事情是,如果您已安装 lxmlBeautifulSoup 将按照 documentation 中的说明使用它:

如果您不指定任何内容,您将获得已安装的最佳 HTML 解析器。 Beautiful Soup 将 lxml 的解析器评为最佳,然后是 html5lib,然后是 Python 的内置解析器。

无论如何,即使BeautifulSoup 在后台使用lxml,您也可以解析无法直接使用xml 解析的损坏的html。例如:

>>> lxml.etree.fromstring('<html>')
...
XMLSyntaxError: Premature end of data in tag html line 1, line 1, column 7

但是:

>>> bs4.BeautifulSoup('<html>', 'lxml')
<html></html>

最后要注意lxml还提供了旧版BeautifulSoup的接口如下:

>>> lxml.html.soupparser.fromstring('<html>')
<Element html at 0x13bd230>

所以在一天结束时,您可能会使用lxmlBeautifulSoup。您唯一需要选择的就是您最喜欢的 API。

【讨论】:

【参考方案2】:

改用 beutifulsoup。它旨在解析结构不良的数据。

http://pypi.python.org/pypi/BeautifulSoup

http://lxml.de/elementsoup.html

【讨论】:

【参考方案3】:

BeautifulSoup 很好解析html。您可以查看它的示例,并发现它与其他示例相比很好。

【讨论】:

【参考方案4】:

lxml 是通常推荐的。具体来说,lxml.html(如果我没记错的话)。

我相信它在底层使用了 libxml2,但如果 html 特别讨厌,则回退到 beautifulsoup,但不要相信我的话,请查看网站! (http://lxml.de/)

【讨论】:

以上是关于lxml 和 libxml2 哪个更适合在 Python 中解析格式错误的 html?的主要内容,如果未能解决你的问题,请参考以下文章

python lxml库怎么安装

python怎么安装lxml html 解析器

Python通过Lxml库解析网络爬虫抓取到的html

termux下python环境安装lxml

名称空间和 xpath 的 libxml2 错误

Lxml