名称中包含unicode的标签,以及lxml

时间:2012-04-10 15:32:43

标签: python unicode lxml

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

当我使用lxml中的etree来解析这样的文档时,我没有问题,树正确构建。但是当(为了调试目的)我尝试打印一些元素时,我得到一个例外,关于尝试编码为ASCII的一些unicode char。

不是终端配置问题或文件编码错误,因为我可以毫无问题地打印包含相同unicode字符的节点(.tag)的名称。显然,问题是由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ño。不应print x生成类似<Element año at b7d26eb4>的内容吗?

这是一个已知问题吗?有关变通方法的任何想法吗?

1 个答案:

答案 0 :(得分:4)

您必须在输出

之前将unicode字符串转换为字节字符串

尝试:

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

引用unicode function

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