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 解析器是啥?的主要内容,如果未能解决你的问题,请参考以下文章