如何构建 html5lib 解析器来处理混合的 XML 和 HTML 标签?

Posted

技术标签:

【中文标题】如何构建 html5lib 解析器来处理混合的 XML 和 HTML 标签?【英文标题】:How to build html5lib parser to deal with a mixture of XML and HTML tags? 【发布时间】:2013-03-08 16:51:36 【问题描述】:

我正在尝试使用 BeautifulSoup 解析一个 html 文件,该文件包含许多从 LexisNexis(法律数据库)批量下载的单个文档。

我的第一个任务是将 HTML 文件拆分为其组成文档。我认为这很容易,因为文档被 <DOC NUMBER=1>body of the 1st document</DOC> 包围等等。

但是,这个<DOC> 标记是一个XML 标记,而不是一个HTML 标记(文件中的所有其他标记都是HTML)。因此,使用常规 HTML 解析器时,此标记在树中不可用。

如何在 bs4 中构建一个解析器来获取这个 XML 标记? 我附上 HTML 文件的相关部分:

<!-- Hide XML section from browser <DOC NUMBER=1> <DOCFULL> --> BODY <!-- Hide XML section from browser </DOCFULL> </DOC> -->

【问题讨论】:

【参考方案1】:

您可以在实例化 BeautifulSoup 对象时在 bs4 中指定 xml:

xml_soup = BeautifulSoup(xml_object, 'xml')

这应该可以解决您的问题。您可以使用xml_soup 对象来解析剩余的html,但是我建议专门为html 实例化另一个soup 对象:

soup = BeautifulSoup(html_object)

【讨论】:

非常感谢!所以我尝试了,但我认为它没有正确处理它。如果我尝试 xml_soup("doc"),则不会返回任何内容,如果我尝试 print(xml_soup.prettify),我会得到一长串 File"/usr/local/lib/python2.7/site-packages/bs4/element .py”,第 1021 行,解码 indent_contents,eventual_encoding,格式化程序)文件“/usr/local/lib/python2.7/site-packages/bs4/element.py”,第 1068 行,在 decode_contents 最后被:RuntimeError 中断:调用 Python 对象时超出最大递归深度 不应该发生递归错误。这可能是 bs4 中的一个错误 如果您打算使用 BeautifulSoup3,而不是使用 xml_soup = BeautifulSoup(xml_object, 'xml'),您可以使用 bs3 的 BeautifulStoneSoup。安装 bs3 后,执行:from BeautifulSoup import BeautifulStoneSoup 然后xml_soup = BeautifulStoneSoup(xml_object)

以上是关于如何构建 html5lib 解析器来处理混合的 XML 和 HTML 标签?的主要内容,如果未能解决你的问题,请参考以下文章

BeautifulSoup - lxml 和 html5lib 解析器抓取差异

如何在Ruby on Rails上使用SAX解析器来处理大型XML文件

BeautifulSoup:“lxml”、“html.parser”和“html5lib”解析器有啥区别?

找不到具有您要求的功能的树生成器:html5lib。您需要安装解析器库吗?

如何在使用 VUE CLI 3.x 时向加载器添加新规则

vueJs 路由组件增加解析:你可能需要合适的加载器来处理这种文件类型