【问题标题】:Stop xml.etree from writing special characters as HTML code阻止 xml.etree 将特殊字符写入 HTML 代码
【发布时间】:2020-07-14 09:28:08
【问题描述】:

在我的代码中,我修改了一些 XML 并将其写入输出文件。不幸的是,xml.etree 将一些特殊字符转换为 HTML 字符,如下所示。有没有办法避免这种情况?如果 xml.etree 无法实现,我愿意接受其他 Python XML 库。

import xml.etree.ElementTree as ET

xml = ET.fromstring("<Item a='ë'/>")

print(ET.tostring(xml))
# b'<Item a="&#235;" />'

【问题讨论】:

    标签: python html python-3.x xml special-characters


    【解决方案1】:

    ElementTree 默认为 US-ASCII 编码。没有办法用 US-ASCII 表示 ë,因此它回退到将字符表示为一个实体,&amp;#235;。

    解决方法很简单:

    print(ET.tostring(xml, encoding='unicode'))
    # => '<Item a="ë" />'
    

    注意这将为您提供str,而不是bytes,但省略encoding 参数将为您提供字节,如您在自己的示例中所见。

    要将 XML 写入文件或通过网络发送,您需要将其转换为字节。使用 Unicode 编码,例如 UTF-8:

    print(ET.tostring(xml, encoding='utf-8'))
    # => b'<Item a="\xc3\xab" />'
    

    【讨论】:

    • 谢谢!编码总是让我感到困惑。所以要写入一个文件,你必须在“wb”模式下打开一个文件句柄,然后你可以将 UTF-8 编码的 XML 写入它。我原以为文件也必须以 UTF8 模式打开。
    • 对于以后的读者,在使用write方法时,也可以指定编码。所以tree.write(path, encoding="utf-8").
    • @BramVanroy 如果您将其写入二进制文件 (open(filename, 'wb')),那么 you 必须进行编码,即整个事情都需要字节。如果您写入文本文件 (open(filename, 'w', encoding='utf8')),那么 Python 将为您进行编码,即整个事情都需要一个字符串。当您已经有一个字符串时,后者更方便。但是您真正应该使用将ElementTree 写入文件的不是open(),而是ElementTree.write()。
    • 这实际上解释了很多。我一直认为为文件句柄指定编码意味着文件句柄只能接收预先存在的 utf-8 编码内容。感谢您的澄清!
    • @BramVanroy 这是因为 UTF-8 是 XML 文件的默认值,即当缺少声明时,所有解析器都假定 UTF-8。试试tree = ET.ElementTree(xml) 和tree.write('filename.xml', encoding='Windows-1252')。用十六进制编辑器查看文件,看看与 UTF-8 编码文件的区别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 2018-03-26
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多