在 python 中解析 HTML - lxml 或 BeautifulSoup?其中哪一个更适合啥样的目的?

     2023-02-16     70

关键词:

【中文标题】在 python 中解析 HTML - lxml 或 BeautifulSoup?其中哪一个更适合啥样的目的?【英文标题】:Parsing HTML in python - lxml or BeautifulSoup? Which of these is better for what kinds of purposes?在 python 中解析 HTML - lxml 或 BeautifulSoup?其中哪一个更适合什么样的目的? 【发布时间】:2010-12-27 16:19:31 【问题描述】:

据我所知,Python 中的两个主要 HTML 解析库是 lxml 和 BeautifulSoup。我为我正在进行的项目选择了 BeautifulSoup,但我选择它并没有什么特别的原因,只是觉得语法更容易学习和理解。但是我看到很多人似乎更喜欢 lxml,而且我听说 lxml 更快。

所以我想知道一个比另一个有什么优势?我什么时候想使用 lxml,什么时候使用 BeautifulSoup 更好?还有其他值得考虑的库吗?

【问题讨论】:

BeautifulSoup and lxml.html - what to prefer? 的可能重复我写了一个detailed answer;因为问题重复所以在这里转贴。 对不起,我的意思是关闭另一个。现在标记另一个。我认为在哪里升旗并不重要,在旧的还是在新的。 【参考方案1】:

我肯定会使用 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. 

【讨论】:

【参考方案2】:

Pyquery 为 Python 提供了 jQuery 选择器接口(在底层使用 lxml)。

http://pypi.python.org/pypi/pyquery

真的太棒了,其他的我都不用了。

【讨论】:

我一直想试试这个库。看起来很有趣。 这比 bs4 好用。我在使用 bs4 时遇到了一些问题,diagnose 甚至无法正常工作:(【参考方案3】:

总而言之,lxml 被定位为闪电般快速的生产质量 html 和 xml 解析器,顺便说一下,它还包括一个 soupparser 模块以依赖 BeautifulSoup 的功能。 BeautifulSoup 是一个单人项目,旨在节省您从格式不佳的 html 或 xml 中快速提取数据的时间。

lxml documentation 表示两种解析器都有优点和缺点。出于这个原因,lxml 提供了一个soupparser,因此您可以来回切换。引用,

BeautifulSoup 使用不同的解析方法。它不是真正的 HTML 解析器,但使用正则表达式来浏览标签汤。它是 因此在某些情况下更宽容,而在其他情况下则不太好。它是 lxml/libxml2 更好地解析和修复损坏的 HTML 并不少见, 但是 BeautifulSoup 对编码检测有卓越的支持。 它 很大程度上取决于哪个解析器工作得更好。

最后他们说,

使用这个解析器的缺点是它慢得多 lxml 的 HTML 解析器。 因此,如果性能很重要,您可能需要 考虑仅在某些情况下将 soupparser 用作后备。

如果我理解正确,这意味着汤解析器更强大——它可以通过使用正则表达式来处理格式错误的标签的“汤”——而lxml 更简单,只解析事物并按照您的预期构建一棵树。我认为它也适用于BeautifulSoup 本身,而不仅仅是lxmlsoupparser

他们还展示了如何从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的创建者的话来说,

就是这样!玩得开心!我写了美丽的汤来节省大家的时间。 一旦你习惯了它,你应该能够把数据从 设计不佳的网站只需几分钟。如果你给我发电子邮件 有任何 cmets,遇到问题,或希望我了解您的 使用 Beautiful Soup 的项目。

 --Leonard

引自Beautiful Soup documentation。

我希望现在已经清楚了。 The soup 是一个出色的单人项目,旨在节省您从设计不佳的网站中提取数据的时间。目标是立即为您节省时间,完成工作,不一定是为了长期节省时间,也绝对不是为了优化软件的性能。

另外,来自lxml website,

lxml 已经从 Python Package Index 下载了两个以上 百万次,也可直接以多种包装形式提供 分布,例如适用于 Linux 或 MacOS-X。

还有,来自Why lxml?,

C 库 libxml2 和 libxslt 具有巨大的优势:... 符合标准...功能齐全...速度快。快速地!快速地! ... lxml 是 libxml2 和 libxslt 的新 Python 绑定...

【讨论】:

【参考方案4】:

不要使用 BeautifulSoup,使用 lxml.soupparser 那么你就坐在lxml 的强大功能之上,可以使用BeautifulSoup 的优点来处理非常破碎和蹩脚的HTML。

【讨论】:

我知道这是很久以前发布的,但这仍然有效吗?像2009年那样工作吗? :D【参考方案5】:

可以找到一个有点过时的速度比较here,它明确推荐lxml,因为速度差异似乎很大。

【讨论】:

【参考方案6】:

对于初学者,BeautifulSoup 不再积极维护,the author even recommends alternatives 如 lxml。

引用链接页面:

Beautiful Soup 3.1.0 版可以 在现实世界的 HTML 上明显更糟 比 3.0.8 版本。最多 常见问题正在处理 标签错误,“错误的开始 tag”错误和“bad end tag”错误。 这个页面解释了发生了什么,如何 问题将得到解决,并且 你现在可以做什么。

这个页面最初是写在 2009 年 3 月。此后,3.2 系列 已发布,替换 3.1 系列,以及 4.x 的开发 系列已经开始。这一页 将保持历史 目的。

tl;dr

改用 3.2.0。

【讨论】:

+1 不知道 BeautifulSoup 的衰败,我依赖和崇拜它。 恕我直言,这是一种误导 - 仔细阅读该页面会发现 lxml 只是有问题的 3.1.0 版本的替代品,其问题已在 3.2.0 中修复,现在甚至第 4 版即将在 2 个月前发布 - 因此该模块几乎“不再积极维护”。 请修改答案 很高兴看到 BeautifulSoup 再次得到维护。 3.2.0 于 2010 年 11 月发布——在这个答案之后将近一年.. :) 我怀疑这是否应该是今天公认的答案。这里的一切都是几乎无用的信息(怀旧/历史目的除外)。 当我读到这篇文章时,我以为 bs4 已经死了。发现“改用 3.2.0”后松了一口气。【参考方案7】:

我使用 lxml 解析 HTML 取得了巨大成功。它似乎也可以很好地处理“soupy” 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()

【讨论】:

python操作xml和html,lxml类库的使用

LXML是Python中一个强大的XML和HTML处理库,它是基于libxml2和libxslt库构建的,并提供了一系列方便的API来处理XML和HTML文档。在本教程中,我们将学习如何使用LXML库来解析、操作和生成XML和HTML文档。安装LXML库在使用LXML库之前,我们... 查看详情

python爬虫编程思想(39):使用lxml解析html与xml

...p;           lxml是Python的一个解析库,用于解析HTML和XML,支持XPath解析方式。由于lxml底层是使用C语言编写的,所以解析效率非常高。本节会介绍lxml在Windows、Li 查看详情

使用 python 解析 HTML 表 - HTMLparser 或 lxml

】使用python解析HTML表-HTMLparser或lxml【英文标题】:parsingHTMLtableusingpython-HTMLparserorlxml【发布时间】:2012-04-1218:03:42【问题描述】:我有一个包含一个表格的html页面,我想获取该表格中td、tr中的所有值。我曾尝试使用beautifulsoup,... 查看详情

如何在 Python 和 LXML 中解析 XML?

】如何在Python和LXML中解析XML?【英文标题】:HowtoparseXMLinPythonandLXML?【发布时间】:2012-12-2617:35:57【问题描述】:这是我的项目:我正在使用RRDTool从WeatherBug绘制天气数据。我需要一种简单有效的方法来从WeatherBug下载天气数据。... 查看详情

Python:在 lxml.cssselect 中使用的 CSS 选择器

】Python:在lxml.cssselect中使用的CSS选择器【英文标题】:Python:CSSSelectortouseinsidelxml.cssselect【发布时间】:2012-01-2905:06:54【问题描述】:我正在尝试使用lxml.html并使用CSSSelector而不是XPath解析下面给出的html代码。link=doc.cssselect(\'html... 查看详情

解析源代码(Python)方法:Beautiful Soup、lxml、html5lib 的区别?

】解析源代码(Python)方法:BeautifulSoup、lxml、html5lib的区别?【英文标题】:ParsingSourceCode(Python)Approach:BeautifulSoup,lxml,html5libdifference?【发布时间】:2012-06-1203:38:51【问题描述】:我有一个很大的HTML源代码,我想解析(~200,000)... 查看详情

爬虫之beautifulsoup(代码片段)

...:BeautifulSoup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式安装beautifulsoup4>:pipinstallbeautifulsoup4解析器BeautifulSoup支持Python标准库中的HTML解析器,还支持一... 查看详情

爬虫beatifulsoup模块(代码片段)

...bsp;BeautifulSoup 是一个可以从HTML或XML文件中提取数据的Python库安装pipinstallbeautifulsoup4 解析器下载BeautifulSoup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,其中一个是lxml.根据操作系统不同,可以选择下列方法来... 查看详情

解析库之beautifulsoup,pyquery(代码片段)

...soup模块BeautifulSoup是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.BeautifulSoup会帮你节省数小时甚至数天的工作时间.你可能在寻找BeautifulSoup3的文档,BeautifulSoup3... 查看详情

在 Python 中解析 HTML [关闭]

】在Python中解析HTML[关闭]【英文标题】:ParsingHTMLinPython[closed]【发布时间】:2010-10-1713:57:47【问题描述】:如果我不能使用BeautifulSoup或lxml,解析HTML的最佳选择是什么?我有一些使用SGMLlib的代码,但它有点低级,现在已弃用。... 查看详情

如何在python中解析格式错误的HTML

】如何在python中解析格式错误的HTML【英文标题】:HowtoparsemalformedHTMLinpython【发布时间】:2010-10-2815:01:32【问题描述】:我需要浏览已解析HTML文档的DOM树。我在用lxml解析字符串之前使用的是uTidyLiba=tidy.parseString(html_code,选项)dom=et... 查看详情

使用 Lxml 解析 HTML

】使用Lxml解析HTML【英文标题】:ParsingHTMLwithLxml【发布时间】:2011-04-0321:44:43【问题描述】:我需要帮助从带有lxml的页面中解析出一些文本。我尝试了beautifulsoup,但我正在解析的页面的html非常损坏,无法正常工作。所以我已经... 查看详情

爬虫解析库re,beautifulsoup,(代码片段)

...装BeautifulSouppipinstallbeautifulsoup4#安装解析器BeautifulSoup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,其中一个是lxml.根据操作系统不同,可以选择下列方法来安装lxml:$apt-getinstallPython-lxml$easy_installlxml$pipinstalllxml另一个可... 查看详情

python使用lxml解析html表

】python使用lxml解析html表【英文标题】:pythonparsehtmltableusinglxml【发布时间】:2013-12-2312:05:24【问题描述】:我有一个这样的html表:<TABLE><TR><TD><P>Name</P></TD><TD><P>Fees</P></TD><TD&g 查看详情

在 lxml 中解析 XML 时如何不加载注释

...:2013-08-2106:01:20【问题描述】:我尝试像这样使用lxml在Python中解析XML文件:objectify.parse(xmlPath,parserWithSchema)但XML文件可能在奇怪的地方包含cmets:<root><text>Sa 查看详情

需要python lxml语法帮助来解析html

】需要pythonlxml语法帮助来解析html【英文标题】:Needpythonlxmlsyntaxhelpforparsinghtml【发布时间】:2010-10-1020:06:12【问题描述】:我是python的新手,我需要一些关于使用lxml查找和迭代html标签的语法方面的帮助。以下是我正在处理的用... 查看详情

python通过lxml解析html页面自动组合xpath实例

#coding:utf-8‘‘‘@author:li.liu‘‘‘fromseleniumimportwebdriverfromselenium.webdriver.common.action_chainsimportActionBuilder,ActionChainsfromlxmlimportetreeimporturllibimporttimeimportre#url=‘http://www 查看详情

beautifulsoup模块(代码片段)

...Soup简介BeautifulSoup是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.BeautifulSoup会帮你节省数小时甚至数天的工作时间.你可能在寻找BeautifulSoup3的文档,BeautifulSoup3... 查看详情