在python解析HTML - LXML或BeautifulSoup?哪一个是用于什么样的目的的更好吗?
-
20-09-2019 - |
题
这是我可以做出来,在Python的两个主要HTML解析库是LXML和BeautifulSoup。我选择BeautifulSoup一个项目我的工作,但我选择了它比发现语法有点容易学习和理解其他没有特别的理由。但是,我看到很多人似乎赞成LXML和我听说LXML更快。
所以我不知道什么是一个比其他的优势?什么时候我会想使用LXML和我的时候会关闭使用BeautifulSoup更好?是否有任何其他图书馆值得考虑的?
解决方案
对于初学者来说,BeautifulSoup不再主动维持,并且笔者甚至建议替代如LXML。
从链接的页面引用:
美丽的汤的版本3.1.0确实 现实世界的HTML显著恶化 比版本3.0.8一样。最多 常见问题处理 标签有误,“畸形启动 标签”的错误,和‘坏结束标记’错误。 本页解释发生了什么事,怎么 这个问题将得到解决,并 你可以做什么现在。
本页面原文为 2009年3月从那时起,3.2系列 已经发布,取代了3.1 系列和4.x的发展 系列已经得到了正在进行中。这一页 仍将上行历史 目的。
<强> TL;博士强>
使用3.2.0代替。
其他提示
总之,lxml
定位为闪电般快速生产质量HTML和XML解析器,顺便说一下,还包括soupparser
模块退到BeautifulSoup的功能。 BeautifulSoup
是一个人的项目,旨在为您节省时间快速提取出数据不佳形成HTML或XML的。
LXML文档说,既解析器具有优点和缺点。出于这个原因,lxml
提供soupparser
这样你就可以来回切换。报价,
BeautifulSoup使用不同的解析方法。这是不是一个真正的HTML 解析器但使用正则表达式通过标签汤潜水。它是 因此,在某些情况下,更多的宽容和别人不太好。它是 并不少见LXML / libxml2的解析和修复损坏的HTML更好, 但BeautifulSoup有编码检测superiour支持。的它 非常依赖于哪个分析器更好地工作的输入。强>
在结束他们说,
使用该分析器的缺点是,它是的慢得多强>比 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
的创建者的话,
这就是它!玩得开心!我写了美丽的汤,以节省大家的时间。 一旦你习惯了它,你应该能够缠斗数据出来的 设计拙劣的在短短几分钟的网站。给我发电子邮件,如果你 有任何意见,遇到问题,或者想我了解你 使用美丽的汤项目。
--Leonard
从美丽的汤文档。
我希望这是现在很清楚。汤是一个辉煌的一个人的项目,旨在节省您的时间来提取数据进行设计拙劣的网站。我们的目标是正确的,现在为您节省时间,把工作做好,不一定要节省您的时间从长远来看,绝对不是优化软件的性能。
此外,从 LXML网站,
LXML已经从Python包指数超过两个下载 万次,也可直接在许多包装 分布,例如用于Linux或者MacOS-X。
和,从为什么LXML?,
在C库libxml2和拥有的libxslt巨大的好处:... 符合标准的...全功能...快。快速!快速! ... LXML 是一个新的Python为libxml2的结合和...的libxslt
不要使用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.
一个有些过时速度对比可以发现此处一>,它清楚地建议LXML,作为速度差似乎激烈。