python - 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 文件中,没有额外的空格或任何其他字符。
解决方案
我的文件开头有一个 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)
推荐阅读
- prolog - 查找一定长度的子串
- r - 如何在 R 中的两个数据框之间找到公共行并将其删除
- javascript - 仅在需要时调用 Cypress 命令
- kubernetes - Kubernetes 上的芹菜在收到后 15 分钟执行任务
- excel - 获取 Excel 单元格内的共享点元数据
- python - 如何用 NaN 替换 DataFrame 中的文本?
- python - 我正在使用 OOP 为习惯跟踪器创建后端,但出现“NameError:调用 create 方法时未定义名称”
- javascript - ParticlesJS Canvas 在页面上可见,页面内容仍然可选择
- javascript - Rethinkdb - withFields 返回空数据
- mysql - 选择语句返回我不想要的数据