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自己 - 也许这只是习惯的力量:)).
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自己,而不仅仅适用soupparser于lxml.
他们还展示了如何从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的项目,请给我发电子邮件.
Run Code Online (Sandbox Code Playgroud)--Leonard
我希望现在已经清楚了.汤是一个精彩的单人项目,旨在为您节省时间从设计不佳的网站中提取数据.目标是为您节省时间,完成工作,不一定能节省您的长期时间,绝对不是为了优化软件的性能.
另外,从lxml网站,
lxml已经从Python Package Index下载了200多万次,也可以在许多软件包发行版中直接使用,例如Linux或MacOS-X.
而且,从为什么lxml?,
C库libxml2和libxslt具有巨大的优势:......符合标准......功能齐全......快速.快速!快速!... lxml是libxml2和libxslt的新Python绑定...