Python 名称中使用unicode和lxml的标记

Python 名称中使用unicode和lxml的标记,python,unicode,lxml,Python,Unicode,Lxml,假设我有一个在标记名中使用Unicode的文档,例如2012 当我从lxml使用etree解析这样一个文档时,我没有问题,树是正确构建的。但当(出于调试目的)我尝试打印某些元素时,我得到一个异常,即尝试将某些unicode字符编码为ASCII时失败 不是终端配置问题或文件编码错误,因为我可以毫无问题地打印包含相同unicode字符的节点名(.tag)。显然,这个问题是由元素对象的“字符串化”引起的,它假定标记名是普通的ascii 下面的代码显示了该问题(还显示它不是文件/终端/编码问题) #编码

假设我有一个在标记名中使用Unicode的文档,例如
2012

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

不是终端配置问题或文件编码错误,因为我可以毫无问题地打印包含相同unicode字符的节点名(
.tag
)。显然,这个问题是由元素对象的“字符串化”引起的,它假定标记名是普通的ascii

下面的代码显示了该问题(还显示它不是文件/终端/编码问题)

#编码:utf-8
从lxml导入etree
doc=”“”
2012
"""
x=etree.fromstring(doc)#没问题
打印x.tag#没问题
打印x#异常
在具有正确定义的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)
año
回溯(最近一次呼叫最后一次):
文件“procesar.py”,第8行,在
打印x
UnicodeEncodeError:“ascii”编解码器无法对位置10中的字符u'\xf1'进行编码:序号不在范围内(128)
注意
print x.tag
如何正确输出
año
print x
不应该产生类似于
的东西吗


这是一个已知的问题吗?关于解决方法有什么想法吗?

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

尝试:

引述:

对于提供_unicode__()方法的对象,它将在不带参数的情况下调用此方法以创建unicode字符串。对于所有其他对象,将请求8位字符串版本或表示,然后使用“严格”模式下默认编码的编解码器将其转换为Unicode字符串。
在输出之前,必须将unicode字符串转换为字节字符串

尝试:

引述:

对于提供_unicode__()方法的对象,它将在不带参数的情况下调用此方法以创建unicode字符串。对于所有其他对象,将请求8位字符串版本或表示,然后使用“严格”模式下默认编码的编解码器将其转换为Unicode字符串。
我可以用lxml复制这个。元素树工程;它打印
。我尝试使用ElementTree,但出现了相同的异常。也许我使用的是旧版本,问题已经解决了。help(elementtree)在我的机器中显示
#$Id:uuuu init_uuuuuy.py 1821 2004-06-03 16:57:49Z fredrik$
,它看起来已经足够旧了。。。顺便说一句,当你说“我可以复制这个…”你的意思是你有同样的问题,还是有打字错误?不管怎样。。。这是一个有些不同的问题。如何重新定义元素。以便尝试解决问题?如果我尝试执行
x.\uuu repr\uuu=other\u函数
我会得到
AttributeError:'etree.\u元素“object attribute”\uu repr\uuu是只读的
。元素树工程;它打印
。我尝试使用ElementTree,但出现了相同的异常。也许我使用的是旧版本,问题已经解决了。help(elementtree)在我的机器中显示
#$Id:uuuu init_uuuuuy.py 1821 2004-06-03 16:57:49Z fredrik$
,它看起来已经足够旧了。。。顺便说一句,当你说“我可以复制这个…”你的意思是你有同样的问题,还是有打字错误?不管怎样。。。这是一个有些不同的问题。如何重新定义元素。以便尝试解决问题?如果我尝试执行
x.\uuu repr\uuu=other\u函数
我会得到
AttributeError:'etree.\u元素“object attribute”\uu repr\uu\uu\uu\uu是只读的
,事实上,最后的编码步骤不是必需的,因为python会自动尝试将unicode字符串编码为终端编码。在我的例子中,由于我定义了
LC\u ALL
print unicode(x)
。然而,我不明白为什么。我按unicode(x)首先尝试x。uuu str_uuuuuuuuu或x。uuu repr_uuuuuuuuuu应该引发相同的异常,不是吗?@JLDiaz Python首先尝试使用
\uuuuuu unicode\uuuuuuuuuuuuu
方法,如果它不存在,则尝试转换。在回答中添加了一段关于这一点的引语。@Marcin不,他使用的是一个像字符串一样的对象,你不能简单地“打印”一个对象,这毫无意义,它必须被转换,unicode函数就是这样做的,将它转换成unicode字符串。@KurzedMetal但是,print x.\uuuuUnicode\uuuu()不起作用,因为Element对象不提供uuuuuu unicode\uuuu()方法所以它是如何工作的?@KurzedMetal您的代码是正确的,但您的解释充其量只是误导。事实上,不需要最后的编码步骤,因为python会自动尝试将unicode字符串编码为终端编码。在我的例子中,由于我定义了
LC\u ALL
print unicode(x)
。然而,我不明白为什么。我按unicode(x)首先尝试x。uuu str_uuuuuuuuu或x。uuu repr_uuuuuuuuuu应该引发相同的异常,不是吗?@JLDiaz Python首先尝试使用
\uuuuuu unicode\uuuuuuuuuuuuu
方法,如果它不存在,则尝试转换。在回答中添加了一段关于这一点的引语。@Marcin不,他使用的是一个像字符串一样的对象,你不能简单地“打印”一个对象,这毫无意义,它必须被转换,unicode函数就是这样做的,将它转换成unicode字符串。@KurzedMetal但是,print x.\uuuuUnicode\uuuu()不起作用,因为Element对象不提供uuuuuu unicode\uuuu()方法所以它是如何工作的?@KurzedMetal你的代码是正确的,但你的解释充其量只是误导。
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 unicode(x).encode('utf8')