我正在开发一个涉及解析HTML的项目。
在搜索之后,我发现了两个可能的选项:BeautifulSoup和lxml.html
有什么理由比较喜欢一个吗?我已经在一段时间后使用了lxml for XML,我觉得我会更舒服,但是BeautifulSoup似乎很常见。
我知道我应该使用适合我的那个,但我一直在寻找两者的个人经历。
答案 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:
答案 3 :(得分:0)
lxml太棒了。但是,仅当dom结构实际上帮助您找到所需内容时,将输入解析为html才有用。
您可以使用普通的字符串函数或正则表达式吗?对于很多html解析任务,将输入视为字符串而不是html文档是违反直觉的,更简单。