这是我可以做出来,在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代替。

其他提示

Pyquery提供(使用lxml的罩下)jQuery选择界面到Python。

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

这是真正真棒,我不使用其他任何东西了。

总之,lxml定位为闪电般快速生产质量HTML和XML解析器,顺便说一下,还包括soupparser模块退到BeautifulSoup的功能。 BeautifulSoup是一个人的项目,旨在为您节省时间快速提取出数据不佳形成HTML或XML的。

LXML文档说,既解析器具有优点和缺点。出于这个原因,lxml提供soupparser这样你就可以来回切换。报价,

  

BeautifulSoup使用不同的解析方法。这是不是一个真正的HTML   解析器但使用正则表达式通过标签汤潜水。它是   因此,在某些情况下,更多的宽容和别人不太好。它是   并不少见LXML / libxml2的解析和修复损坏的HTML更好,   但BeautifulSoup有编码检测superiour支持。的它   非常依赖于哪个分析器更好地工作的输入。

在结束他们说,

  

使用该分析器的缺点是,它是的慢得多比   LXML的HTML解析器。 所以,如果性能问题,则可能需要   考虑使用soupparser仅作为某些情况下,回退。

如果我正确地理解他们,这意味着汤分析器是更强大的---它可以通过使用正则表达式处理畸形标签的“汤” ---而lxml更简单,只是分析的东西,并建立一棵树,你期望的那样。我认为它也适用于BeautifulSoup本身,而不是仅仅在soupparserlxml

他们还展示了如何从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. 
scroll top