据我所知,Python中的两个主要HTML解析库是lxml和BeautifulSoup . 我选择了BeautifulSoup作为我正在研究的项目,但除了找到更容易学习和理解的语法之外,我选择了它 . 但是我看到很多人似乎都喜欢lxml而且我听说lxml更快 .
所以我想知道一个优于另一个的优点是什么?我什么时候想使用lxml?什么时候最好使用BeautifulSoup?还有其他值得考虑的图书馆吗?
对于初学者来说,不再积极维护BeautifulSoup,作者甚至建议使用lxml等替代品 .
从链接页面引用:
版本3.1.0的Beautiful Soup在真实HTML上的表现比3.0.8版本差得多 . 最常见的问题是错误处理标记,“格式错误的开始标记”错误和“错误结束标记”错误 . 这个页面解释了发生了什么,如何解决问题,以及你现在可以做些什么 . 这个页面最初是在2009年3月写的 . 从那时起,3.2系列已经发布,取代了3.1系列,并且4.x系列的开发已经开始 . 此页面将保留用于历史目的 . tl; dr使用3.2.0代替 .
Pyquery 为Python提供了jQuery选择器接口(在引擎盖下使用lxml) .
Pyquery
http://pypi.python.org/pypi/pyquery
它真的很棒,我不再使用其他任何东西了 .
总而言之, lxml 定位为闪电般快速的 生产环境 质量html和xml解析器,顺便说一下,它还包含一个 soupparser 模块,可以依赖于BeautifulSoup的功能 . BeautifulSoup 是一个单人项目,旨在帮助您节省时间从格式不正确的html或xml中快速提取数据 .
lxml
soupparser
BeautifulSoup
lxml documentation说两种解析器都有优点和缺点 . 因此, 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))
(相同来源:http://lxml.de/elementsoup.html) .
用 BeautifulSoup 的创作者的话来说,
就是这样!玩得开心!我写了美丽的汤来节省每个人的时间 . 一旦你习惯了它,你应该能够在几分钟内从设计不佳的网站中搜集数据 . 如果您有任何意见,遇到问题或希望我了解您使用Beautiful Soup的项目,请给我发电子邮件 . --Leonard
引用自Beautiful Soup documentation .
我希望现在已经清楚了 . 汤是一个精彩的单人项目,旨在为您节省时间从设计不佳的网站中提取数据 . 目标是为您节省时间,完成工作,不一定能节省您的长期时间,绝对不是为了优化软件的性能 .
另外,从lxml website,
lxml已经从Python Package Index下载了200多万次,也可以直接在许多软件包发行版中使用,例如:适用于Linux或MacOS-X .
并且,从Why lxml?,
C库libxml2和libxslt具有巨大的优势:......符合标准......功能齐全......快速 . 快速!快速! ... lxml是libxml2和libxslt的新Python绑定...
不要使用BeautifulSoup,使用lxml.soupparser然后你就坐在lxml的力量之上,并且可以使用BeautifulSoup的好处来处理真正破碎的和糟糕的HTML .
我使用lxml非常成功地解析HTML . 它似乎也很好地处理“汤”HTML . 我强烈推荐它 .
这是我试图处理一些丑陋的HTML的快速测试:
import unittest from StringIO import StringIO from lxml import etree class TestLxmlStuff(unittest.TestCase): bad_html = """ <html> <head><title>Test!</title></head> <body> <h1>Here's a heading <p>Here's some text <p>And some more text <b>Bold!</b></i> <table> <tr>row <tr><td>test1 <td>test2 </tr> <tr> <td colspan=2>spanning two </table> </body> </html>""" def test_soup(self): """Test lxml's parsing of really bad HTML""" parser = etree.HTMLParser() tree = etree.parse(StringIO(self.bad_html), parser) self.assertEqual(len(tree.xpath('//tr')), 3) self.assertEqual(len(tree.xpath('//td')), 3) self.assertEqual(len(tree.xpath('//i')), 0) #print(etree.tostring(tree.getroot(), pretty_print=False, method="html")) if __name__ == '__main__': unittest.main()
我肯定会使用EHP . 它比lxml更快,更优雅,更简单易用 .
查看 . https://github.com/iogf/ehp
<body ><em > foo <font color="red" ></font></em></body> from ehp import * data = '''<html> <body> <em> Hello world. </em> </body> </html>''' html = Html() dom = html.feed(data) for ind in dom.find('em'): print ind.text()
输出:
Hello world.
一个有点过时的速度比较可以找到here,它清楚地推荐lxml,因为速度差异似乎很大 .
7 回答
对于初学者来说,不再积极维护BeautifulSoup,作者甚至建议使用lxml等替代品 .
从链接页面引用:
Pyquery
为Python提供了jQuery选择器接口(在引擎盖下使用lxml) .http://pypi.python.org/pypi/pyquery
它真的很棒,我不再使用其他任何东西了 .
总而言之,
lxml
定位为闪电般快速的 生产环境 质量html和xml解析器,顺便说一下,它还包含一个soupparser
模块,可以依赖于BeautifulSoup的功能 .BeautifulSoup
是一个单人项目,旨在帮助您节省时间从格式不正确的html或xml中快速提取数据 .lxml documentation说两种解析器都有优点和缺点 . 因此,
lxml
提供了soupparser
,因此您可以来回切换 . 引用,最后他们说,
如果我理解正确,那就意味着汤解析器更强大 - 它可以通过使用正则表达式来处理错误标签 - 而
lxml
更简单,只需解析事物并构建一棵树就像你一样期望 . 我假设它也适用于BeautifulSoup
本身,而不仅仅是soupparser
适用于lxml
.他们还展示了如何从
BeautifulSoup
的编码检测中受益,同时仍然使用lxml
快速解析:(相同来源:http://lxml.de/elementsoup.html) .
用
BeautifulSoup
的创作者的话来说,引用自Beautiful Soup documentation .
我希望现在已经清楚了 . 汤是一个精彩的单人项目,旨在为您节省时间从设计不佳的网站中提取数据 . 目标是为您节省时间,完成工作,不一定能节省您的长期时间,绝对不是为了优化软件的性能 .
另外,从lxml website,
并且,从Why lxml?,
不要使用BeautifulSoup,使用lxml.soupparser然后你就坐在lxml的力量之上,并且可以使用BeautifulSoup的好处来处理真正破碎的和糟糕的HTML .
我使用lxml非常成功地解析HTML . 它似乎也很好地处理“汤”HTML . 我强烈推荐它 .
这是我试图处理一些丑陋的HTML的快速测试:
我肯定会使用EHP . 它比lxml更快,更优雅,更简单易用 .
查看 . https://github.com/iogf/ehp
输出:
一个有点过时的速度比较可以找到here,它清楚地推荐lxml,因为速度差异似乎很大 .