首页 > 解决方案 > BeautifulSoup4 不接受有效的 XML

问题描述

我正在尝试打开一个有效的 xml 文件,用 解析它lxml-xml,美化它,最后将它保存到另一个文件中。

我的代码如下:

def main(path_to_config):
    with open(f'configs/{path_to_config}', 'r') as file:
        contents = file.read()
        soup = BeautifulSoup(contents, 'xml')
        with open(f'pretty_xml/{path_to_config.split("_")[0]}.xml', 'w') as new_file:
            new_file.write(soup.prettify())

不幸的是,无论将什么放入文件中,解析都不会生成有效的 xml。单行<?xml version="1.0" encoding="utf-8"?>是保存到pretty_config/文件中的所有内容。我已经通过多个在线验证器验证了我传递的 xml 是有效的。

我试过用file.read()文件替换,没有运气。我也尝试用一串 xml 替换它,它可以工作并验证我的解析器正在工作,并且在文件打开和将内容传递到BeautifulSoup.

对此的任何帮助将不胜感激。

更新:

我的 xml 文件只有一行,<note><time>twelve</time></note>.

作为健全性检查,我添加assert contents == '<note><time>twelve</time></note>'了当我将字符串传递给BeautifulSoup解析器时没有问题。这条新线抛出了一个AssertionError,我完全不确定如何。字符串不应该相同吗?我将 .py 文件中的字符串直接复制到 .xml 文件中,没有额外的空格或任何其他字符。

标签: pythonxmlbeautifulsoup

解决方案


我的文件开头有一个 BOM,它没有被从 .py 文件复制粘贴到 .xml 文件覆盖。

多亏了@snakecharmerb 的建议,我发现了这一点,repr(contents)用于查看我的字符串的真实表示,并发现值为'\'\\ufeff<note><time>twelve</time></note>\''. \ufeff 是一个BOM,需要删除。

我在函数的开头添加了以下几行,它修复了错误。

s = open(f'configs/{path_to_config}', mode='r', encoding='utf-8-sig').read()
open(f'configs/{path_to_config}', mode='w', encoding='utf-8').write(s)

推荐阅读