【问题标题】:BeautifulSoup4 not accepting valid XMLBeautifulSoup4 不接受有效的 XML
【发布时间】: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


【解决方案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)

【讨论】:

    猜你喜欢
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 2020-06-08
    • 1970-01-01
    • 2018-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多