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
。需要注意的一件有趣的事情是,如果您已安装 lxml
,BeautifulSoup
将按照 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>
所以在一天结束时,您可能会使用lxml
和BeautifulSoup
。您唯一需要选择的就是您最喜欢的 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?的主要内容,如果未能解决你的问题,请参考以下文章