我正在从事一个项目,将涉及解析HTML。
在四处搜索之后,我发现了两个可能的选项: BeautifulSoup和lxml.html
有什么理由更喜欢其中之一吗?我以前使用过lxml for XML,我觉得我会更习惯使用它,但是BeautifulSoup似乎很常见。
我知道我应该使用对我有效的那个,但我在寻找两者的个人经验。
发布于 2011-02-11 16:51:50
imo,简单的答案是,如果您相信您的源代码是格式良好的,那么就使用lxml解决方案。否则,就会一直使用BeautifulSoup。
编辑:
这个答案现在已经三年了;值得注意的是,正如Jonathan Vanasco在评论中所做的那样,BeautifulSoup4现在支持使用lxml作为内部解析器,所以如果您愿意,您可以使用BeautifulSoup的高级特性和接口,而不会对性能造成大部分影响(尽管我自己仍然直接使用lxml --也许这只是习惯的力量:)。
发布于 2013-10-24 01:48:33
总之,lxml被定位为一个生产质量极快的html和xml解析器,顺便说一句,它还包含一个soupparser模块,用于依赖BeautifulSoup的功能。BeautifulSoup是一个人的项目,旨在节省您从格式不佳的html或xml中快速提取数据的时间。
lxml documentation说这两种解析器都有优点和缺点。出于这个原因,lxml提供了一个soupparser,以便您可以来回切换。引用,
BeautifulSoup使用不同的解析方法。它不是一个真正的HTML解析器,而是使用正则表达式来分析标签汤。因此,在某些情况下,它是更宽容的,而在其他情况下,它就不那么好了。lxml/libxml2更好地解析和修复损坏的超文本标记语言并不少见,但是BeautifulSoup对编码检测提供了更好的支持。它在很大程度上取决于输入哪个解析器工作得更好。
最后他们会说,
使用这个解析器的缺点是,它比
的解析器要慢得多。因此,如果性能很重要,您可能需要考虑仅在某些情况下使用作为后备方案。
如果我理解正确的话,这意味着soup解析器更健壮-它可以使用正则表达式处理格式错误的标记的“汤”-而lxml更简单,只像您所期望的那样解析事物并构建树。我假设它也适用于BeautifulSoup本身,而不仅仅是lxml的soupparser。
它们还展示了如何在使用lxml快速解析的同时,从BeautifulSoup的编码检测中获益
>>> 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))(同一来源:http://lxml.de/elementsoup.html)。
用BeautifulSoup创建者的话说,
就是这样!玩得开心!我写了“美丽的汤”来节省大家的时间。一旦你习惯了它,你应该能够在短短几分钟内从设计糟糕的网站中提取数据。发送电子邮件给我,如果你有任何意见,遇到问题,或想让我知道你的项目,使用美丽的汤。
--伦纳德
引用自Beautiful Soup documentation。
我希望这一点现在已经清楚了。The soup是一个出色的单人项目,旨在节省您从设计糟糕的网站中提取数据的时间。我们的目标是现在就节省你的时间,完成工作,不一定要从长远来看节省你的时间,当然也不是为了优化你的软件的性能。
另外,在lxml website上,
Python已经从
包索引中下载了200多万次,并且在许多包发行版中也可以直接获得,例如用于Linux或MacOS-X。
还有,来自Why lxml?的
C库libxml2和libxslt有很大的好处:...符合标准..。全功能..。快地。快地!快!..是一种用于libxml2和libxslt的新Python绑定... lxml
发布于 2011-02-11 18:34:31
两者都用?用于DOM操作的lxml,用于解析的BeautifulSoup:
http://lxml.de/elementsoup.html
https://stackoverflow.com/questions/4967103
复制相似问题