【问题标题】:Fast and effective way to parse broken HTML?解析损坏的 HTML 的快速有效的方法?
【发布时间】:2016-02-19 16:08:45
【问题描述】:

我正在处理需要快速 HTML 解析的大型项目,包括恢复损坏的 HTML 页面。

目前lxml是我的选择,我知道它也为libxml2的恢复模式提供了一个接口,但我对结果并不满意。对于某些特定的 HTML 页面,我发现 BeautifulSoup 的效果非常好(例如:http://fortune.com/2015/11/10/vw-scandal-volkswagen-gift-cards/,这个有一个损坏的<header> 标签,lxml/libxml2 无法纠正)。但是,问题是BS非常慢。

正如我所见,Chrome 和 Firefox 等现代浏览器解析 HTML 的速度非常快,并且能够很好地处理损坏的 HTML。与 lxml 一样,Chrome 的解析器构建在 libxml2 和 libxslt 之上,但具有更有效的破碎 HTML 处理算法。我希望有从 Chromium 导出的独立 repos 以便我可以使用它们,但还没有找到类似的东西。

有没有人知道一个好的库或至少一个解决方法(通过利用当前已知解析器的一部分)?非常感谢!

【问题讨论】:

    标签: html beautifulsoup html-parsing lxml libxml2


    【解决方案1】:

    BeautifulSoup 在使破碎的 HTML 汤变得漂亮方面做得非常好。您可以通过letting it use lxml.html under the hood 加快解析速度:

    如果你不使用 lxml 作为底层解析器,我的建议是开始。 Beautiful Soup 使用 lxml 解析文档的速度明显快于使用 html.parser 或 html5lib。

    soup = BeautifulSoup(html, "lxml")
    

    另一个优化可能是SoupStrainer - 仅解析 HTML 文档的所需部分,但我不确定它是否适用于您的用例。

    你也可以通过安装cchardet library来加快速度:

    您可以通过安装cchardet 库显着加快编码检测速度。

    Documentation reference.


    正如我所见,Chrome 和 Firefox 等现代浏览器解析 HTML 的速度非常快,并且能够很好地处理损坏的 HTML。

    我知道这是一个巨大的开销,但只是为了在您的选项中添加一些东西 - 您可以通过 selenium 启动 Chrome,导航到所需的地址(或打开本地 html 文件)并转储从.page_source返回的HTML:

    from selenium import webdriver
    
    driver = webdriver.Chrome()
    driver.get("url")
    
    # may be a delay or an explicit wait would be needed here
    
    print(driver.page_source)
    
    driver.close()
    

    另见:

    【讨论】:

    • 不错的建议,谢谢!但是,如果我们使用lxml作为底层解析器,是不是也排斥了BS强大的恢复能力呢?据我了解(并且刚刚测试过),使用 lxml 解析器初始化 BS 无法正确解析 fortune.com(我在 OP 中包含的链接),而 html.parser 做得很好(但它的速度要慢得多)。所以我想我们需要两全其美(使用 lxml 解析,使用 BS 恢复)以提高性能和准确性。这甚至可能吗?
    猜你喜欢
    • 2014-02-17
    • 2018-07-08
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 2015-01-23
    • 2015-09-07
    • 2019-08-20
    • 1970-01-01
    相关资源
    最近更新 更多