如何构建 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”解析器有啥区别?