我有一些随机的 HTML,我使用 BeautifulSoup 来解析它,但在大多数情况下(>70%)它会阻塞。我尝试使用Beautiful soup 3.0.8 和3.2.0(3.1.0 向上存在一些问题),但结果几乎相同。
我可以回想起 Python 中可用的几个 HTML 解析器选项:
- 美丽汤
- lxml
- 查询
我打算测试所有这些,但我想知道你的测试中哪一个是最宽容的,甚至可以尝试解析错误的 HTML。
我有一些随机的 HTML,我使用 BeautifulSoup 来解析它,但在大多数情况下(>70%)它会阻塞。我尝试使用Beautiful soup 3.0.8 和3.2.0(3.1.0 向上存在一些问题),但结果几乎相同。
我可以回想起 Python 中可用的几个 HTML 解析器选项:
我打算测试所有这些,但我想知道你的测试中哪一个是最宽容的,甚至可以尝试解析错误的 HTML。
他们都是。我还没有遇到任何在野外发现的 lxml.html 无法解析的 html 页面。如果您尝试解析的页面上有 lxml barfs,您始终可以使用一些正则表达式对它们进行预处理以保持 lxml 满意。
lxml 本身相当严格,但lxml.html
它是一个不同的解析器,可以处理非常破碎的 html。对于非常糟糕的 html,lxml 还附带lxml.html.soupparser
了 BeautifulSoup 库的哪些接口。
此处描述了一些使用 lxml.html 解析损坏的 html 的方法:http: //lxml.de/elementsoup.html
对于不能与其他任何东西一起使用的页面(想到那些包含嵌套<form>
元素的页面),我在MinimalSoup和ICantBelieveItsBeautifulSoup方面取得了成功。每个人都可以处理某些类型的错误,而另一个人则不能,因此您需要同时尝试两者。
我最终使用 BeautifulSoup 4.0 和 html5lib 进行解析,并且更加宽容,对我的代码进行了一些修改,它现在运行良好,感谢大家的建议。
如果 beautifulsoup 不能解决您的 html 问题,那么下一个最佳解决方案将是正则表达式。lxml、elementtree、minidom 在解析方面非常严格,实际上他们做得对。
其他提示:
我通过命令提示符将 html 提供给 lynx 浏览器,然后取出页面/内容的文本版本并使用正则表达式进行解析。
将 html 转换为文本或将 html 转换为 markdown 会去除所有 html 标签,您将保留文本。这很容易解析。