标记中的名称中包含 Unicode 和 lxml



>假设我有一个在标签名称中使用Unicode的文档,例如<año>2012</año>

当我使用 lxml 中的 etree 来解析这样的文档时,我没有问题,树已正确构建。但是,当我(出于调试目的)尝试打印某些元素时,我收到有关尝试将某些 unicode 字符编码为 ASCII 失败的异常。

不是终端配置或文件编码错误的问题,因为我可以毫无问题地打印节点的名称 ( .tag ),其中包含相同的 unicode 字符。 显然,问题是由 Element 对象的"字符串化"引起的,它假设标签名称是普通的 ascii。

以下代码显示了问题(并且还表明它不是文件/终端/编码问题)。

# coding: utf-8
from lxml import etree
doc = """<?xml version="1.0" encoding="utf-8"?>
<año>2012</año>
"""
x = etree.fromstring(doc)   # No problem
print x.tag                 # No problem
print x                     # Exception

在具有正确定义LC_CTYPE的终端中运行上述脚本,生成以下输出:

año
Traceback (most recent call last):
  File "procesar.py", line 8, in <module>
    print x
UnicodeEncodeError: 'ascii' codec can't encode character u'xf1' in position 10: ordinal not in range(128)

请注意print x.tag如何正确输出añoprint x不应该生产类似<Element año at b7d26eb4>的东西吗?

这是一个已知问题吗?关于解决方法的任何想法?

在输出之前,您必须将 unicode 字符串转换为字节字符串

尝试:

print unicode(x).encode('utf8')

引用 Unicode 函数:

对于提供 __unicode__() 方法的对象,它将调用不带参数的此方法来创建 Unicode 字符串。对于所有其他对象,将请求 8 位字符串版本或表示形式,然后在"严格"模式下使用默认编码的编解码器将其转换为 Unicode 字符串。

相关内容

最新更新