xml - BeautifulSoup 抑制 lxml 解析错误?

标签 xml beautifulsoup lxml

我使用 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/

相关文章:

javascript - 使用 javascript 避免在 xml 序列化期间重复命名空间

javascript - Python 请求和 Forbes 'Welcome' 页面重定向

python - BeautifulSoup4 藏在哪里?

python - 在 python 中使用 lxml iterparse 解析大型 .bz2 文件 (40 GB)。未压缩文件不会出现的错误

xml - 如何在 SQL Server 2008 R2 中读取 XML 的一部分作为 XML

xml - BIRT:无法检索 XML 数据源。 XML 数据源文件无效或文件不存在

python - 将 python 脚本转换为使用 lxml 的 etree 模块的 linux 二进制文件的问题

python - 将 ElementTree 转换为 Element

xml - 从 for-each 中的值更改 XPath 查询

python - 从 BeautifulSoup 中抓取 Instagram