Python 中最宽容的 HTML 解析器是啥?

Posted

技术标签:

【中文标题】Python 中最宽容的 HTML 解析器是啥?【英文标题】:What’s the most forgiving HTML parser in Python?Python 中最宽容的 HTML 解析器是什么? 【发布时间】:2011-10-15 18:34:42 【问题描述】:

我有一些随机的 html,我使用 BeautifulSoup 来解析它,但在大多数情况下 (>70%) 它会阻塞。我尝试使用美汤 3.0.8 和 3.2.0(3.1.0 以上有一些问题),但结果几乎相同。

我不禁想起了 Python 中可用的几个 HTML 解析器选项:

美汤 lxml pyquery

我打算测试所有这些,但我想知道您的测试中哪一个最宽容,甚至可以尝试解析错误的 HTML。

【问题讨论】:

因为这不是一个真正的答案,所以我不会发布它,但您所描述的正是开发 Beautiful Soup 的原因:解析错误的 HTML。如果你有一个格式非常糟糕的文档,甚至 Beautiful Soup 都无法解析它,那么你可能就不走运了。我听说过的其他解析器(包括 lxml)要严格得多。 另见***.com/questions/1922032/… 为了保持这个目标,发布每个解析器所针对的最小 sn-p 会很有用。 我没有尝试过任何其他解析器,但只尝试了 beautifulsoup,在我的案例中,它确实有 30% 的时间有效,这仍然令人印象深刻。 @Paul,我已经看过了,这就是为什么我提到我同时使用了 3.0.8 和 3.2.0,我将尝试 4.0 分支来查看其他改进并在这里发布我的结果跨度> 【参考方案1】:

他们都是。我还没有遇到任何在野外发现的 lxml.html 无法解析的 html 页面。如果您尝试解析的页面上有 lxml barfs,您可以随时使用一些正则表达式对它们进行预处理,以保持 lxml 满意。

lxml 本身相当严格,但lxml.html 是一个不同的解析器,可以处理非常破碎的html。对于非常糟糕的 html,lxml 还附带了 lxml.html.soupparser,它与 BeautifulSoup 库接口。

这里描述了一些使用 lxml.html 解析损坏的 html 的方法:http://lxml.de/elementsoup.html

【讨论】:

【参考方案2】:

对于不能与其他任何东西一起使用的页面(想到那些包含嵌套<form> 元素的页面)我已经成功使用MinimalSoup 和ICantBelieveItsBeautifulSoup。每个都可以处理某些类型的错误,而另一个则不能,因此您需要同时尝试两者。

【讨论】:

【参考方案3】:

我最终使用 BeautifulSoup 4.0 和 html5lib 进行解析,并且更加宽容,对我的代码进行了一些修改,现在运行良好,感谢大家的建议。

【讨论】:

【参考方案4】:

如果 beautifulsoup 不能解决您的 html 问题,则下一个最佳解决方案是正则表达式。 lxml、elementtree、minidom 解析非常严格,其实都做对了。

其他提示:

    我通过命令提示符将 html 提供给 lynx 浏览器,然后取出页面/内容的文本版本并使用正则表达式进行解析。

    将 html 转换为文本或将 html 转换为 markdown 会去除所有 html 标记,而您将保留文本。这很容易解析。

【讨论】:

但我需要它来修改 html,所以在我的情况下这不是一个好的解决方案。

以上是关于Python 中最宽容的 HTML 解析器是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Django Rest 框架中使用的解析器是啥?

Python - 所有内置装饰器是啥? [关闭]

你能解释一下 Python 中的装饰器是啥吗? [关闭]

python装饰器是啥意思

Python迭代器是啥?

python迭代器是啥意思