BeautifulSoup和lxml.html - 更喜欢什么?

时间:2011-02-11 08:49:40

标签: python beautifulsoup lxml

我正在开发一个涉及解析HTML的项目。

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

有什么理由比较喜欢一个吗?我已经在一段时间后使用了lxml for XML,我觉得我会更舒服,但是BeautifulSoup似乎很常见。

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

4 个答案:

答案 0 :(得分:35)

简单的答案,imo,如果你相信你的信息源是格式良好的,那么请使用lxml解决方案。否则,BeautifulSoup一路走来。

编辑:

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

答案 1 :(得分:16)

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

lxml documentation说两种解析器都有优点和缺点。因此,lxml提供了soupparser,因此您可以来回切换。报价,

  

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

最后他们说,

  

使用此解析器的缺点是慢得多   lxml的HTML解析器。 因此,如果性能很重要,您可能会想要   考虑将soupparser仅用作某些案例的后备。

如果我理解正确,这意味着汤解析器更强大 - 它可以通过使用正则表达式来处理格式错误标签的“汤” - 而lxml更直接而且恰到好处解析事物并按照您的预期构建树。我认为它也适用于BeautifulSoup本身,而不仅仅适用于soupparser的{​​{1}}。

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

lxml

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

>>> 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)) 的创作者的话来说,

  

就是这样!玩得开心!我写了美丽的汤来节省每个人的时间。   一旦你习惯了它,你应该能够解决数据问题   在短短几分钟内设计糟糕的网站。如果你给我发电子邮件   有任何意见,遇到问题,或希望我了解你的   使用Beautiful Soup的项目。

BeautifulSoup

引自Beautiful Soup documentation

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

此外,来自lxml website

  

已经从Python Package Index下载了两个以上的lxml   百万次,也可直接在许多包装中使用   分发,例如对于Linux或MacOS-X。

而且,来自Why lxml?

  

C库libxml2和libxslt有很多好处:...   符合标准......功能齐全......快速。快速!快速! ... lxml   是libxml2和libxslt ...

的新Python绑定

答案 2 :(得分:2)

同时使用?用于DOM操作的lxml,用于解析的BeautifulSoup:

http://lxml.de/elementsoup.html

答案 3 :(得分:0)

lxml太棒了。但是,仅当dom结构实际上帮助您找到所需内容时,将输入解析为html才有用。

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