我使用 BeautifulSoup 使用 lxml 来解析和导航 XML 文件。
我注意到奇怪的行为。 Beautifulsoup 会抑制 lxml 解析器在读取格式错误的 XML 文件时引发的异常(例如,截断的文档或缺少结束标记)。
示例:
from bs4 import BeautifulSoup
soup = BeautifulSoup("<foo><bar>trololo<", "xml") # this will work
甚至可以调用 find() 并导航这样损坏的 XML 树...
让我们尝试使用纯 lxml 读取完全相同的格式错误文档:
from lxml import etree
root = etree.fromstring("<foo><bar>trololo<") # will throw XMLSyntaxError
这是为什么呢?我知道 BeautifulSoup 本身不做任何解析,它只是 lxml (或其他解析器)的包装库。但我感兴趣的是,如果 XML 格式错误,实际上会出现错误,例如缺少结束标签。我只想要基本的 XML 语法验证(对 XSD 架构验证内容不感兴趣)。
最佳答案
如果您想复制该行为,可以设置recover=True传递解析器:
from lxml import etree
root = etree.fromstring("<foo><bar>trololo<",parser=etree.XMLParser(recover=True)) # will throw XMLSyntaxError
print(etree.tostring(root))
输出:
<foo><bar>trololo</bar></foo>
如果您查看构建器目录中的 bs4 源代码,您将看到 _lxml.py
及其内部:
def default_parser(self, encoding):
# This can either return a parser object or a class, which
# will be instantiated with default arguments.
if self._default_parser is not None:
return self._default_parser
return etree.XMLParser(
target=self, strip_cdata=False, recover=True, encoding=encoding)
lxml 的 HTMLParser 默认设置此值,以便它可以处理损坏的 html,对于xml,您必须指定您想要尝试和恢复。
关于xml - BeautifulSoup 抑制 lxml 解析错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39527682/