BeautifulSoup4不接受有效的XML

时间:2019-10-09 17:18:32

标签: python xml beautifulsoup

我正在尝试打开一个有效的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文件中,没有其他空格或任何其他字符。

1 个答案:

答案 0 :(得分:1)

我的文件开头有一个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)