在 python lxml 库中使用西里尔字母的正确方法是什么

What is right way to use cyrillic in python lxml library

我尝试生成 .xml 文件,其中包含西里尔符号。但结果出乎意料。避免这种结果的最简单方法是什么? 示例:

from lxml import etree

root = etree.Element('пример')

print(etree.tostring(root))

我得到的是:

b'<&#1087;&#1088;&#1080;&#1084;&#1077;&#1088;/>'

我代替:

b'<пример/>'

etree.tostring() 不带附加参数将纯 ASCII 数据输出为 bytes 对象。你可以使用 etree.tounicode():

>>> from lxml import etree
>>> root = etree.Element('пример')
>>> print(etree.tostring(root))
b'<&#1087;&#1088;&#1080;&#1084;&#1077;&#1088;/>'
>>> print(etree.tounicode(root))
<пример/>

或使用 encoding argument 指定编解码器;但是你仍然会得到字节,所以输出需要再次解码:

>>> print(etree.tostring(root, encoding='utf8'))
b'<\xd0\xbf\xd1\x80\xd0\xb8\xd0\xbc\xd0\xb5\xd1\x80/>'
>>> print(etree.tostring(root, encoding='utf8').decode('utf8'))
<пример/>

将编码设置为 unicode 会得到与 tounicode() 相同的输出,并且是首选拼写:

>>> print(etree.tostring(root, encoding='unicode'))
<пример/>