【发布时间】:2020-02-07 02:09:29
【问题描述】:
我正在尝试打开一个有效的 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 文件中,没有额外的空格或任何其他字符。
【问题讨论】:
-
@snakecharmerb
repr(contents)返回'\'\\ufeff<note><time>twelve</time></note>\''我不知道如何解释第一个\'\\ufeff,甚至是什么。 -
谢谢@snakecharmerb。显然 \ufeff 是一个 BOM(字节顺序标记),当我将 .py 文件中的值复制粘贴到 .xml 文件时,它没有被删除。当您右键单击“删除 BOM”时,PyCharm 有一个选项,我这样做了并且文件解析正确。
-
@snakecharmerb 我尝试指定不同的编码,但似乎没有任何区别。
标签: python xml beautifulsoup