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

use*_*312 32 python lxml beautifulsoup

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

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

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

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

sim*_*mon 35

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

编辑:

这个答案现在已经三年了; 这是值得注意的,乔纳森Vanasco做的意见,即BeautifulSoup4现在支持使用lxml作为内部解析器,这样你就可以使用先进的功能和BeautifulSoup的接口,而大部分的性能损失,如果你想(虽然我仍然达到直lxml自己 - 也许这只是习惯的力量:)).

  • 根据我的经验,lxml.html处理格式错误的html就好了. (6认同)
  • 由于最近的编辑,这个问题突然出现了.我只是不想`BeautifulSoup4`支持使用`lxml`作为底层解析器 - 所以现在你基本上可以获得*几乎*lxml的速度(只是一个轻微的命中)和BeautifulSoup的所有奖金. (6认同)
  • 是的,我肯定,如果您已经熟悉lxml,并且您没有"纯python"要求(如Google Appengine).就个人而言,我没有遇到使用lxml.html处理页面的任何问题(相反,我已经能够处理给Beautifulsoup带来问题的页面),除了曾经我必须明确提供正确的字符编码(因为lxml) "信任"不正确的http标头/ html元标签).另请注意,[ElementSoup](http://codespeak.net/lxml/elementsoup.html)使lxml.html能够在必要时使用BeautifulSoup解析器) (3认同)

osa*_*osa 18

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

lxml文档说两个解析器都有优点和缺点.因此,lxml提供一个soupparser可以来回切换的设备.引用,

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

最后他们说,

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

如果我理解正确,这意味着汤解析器更强大 - 它可以通过使用正则表达式来处理格式错误标签的"汤" - 而lxml更直接,只需解析事物并构建一棵树期待.我认为它也适用于BeautifulSoup自己,而不仅仅适用soupparserlxml.

他们还展示了如何从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))
Run Code Online (Sandbox Code Playgroud)

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

BeautifulSoup创作者的话来说,

而已!玩得开心!我写了美丽的汤来节省每个人的时间.一旦你习惯了它,你应该能够在几分钟内从设计不佳的网站中搜集数据.如果您有任何意见,遇到问题或希望我了解您使用Beautiful Soup的项目,请给我发电子邮件.

 --Leonard
Run Code Online (Sandbox Code Playgroud)

引自Beautiful Soup文档.

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

另外,从lxml网站,

lxml已经从Python Package Index下载了200多万次,也可以在许多软件包发行版中直接使用,例如Linux或MacOS-X.

而且,从为什么lxml?,

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