ElementTree的和unicode(ElementTree and unicode)

2019-06-28 03:09发布

我有这样的字符在XML文件中:

<data>
  <products>
      <color>fumè</color>
  </product>
</data>

我尝试用下面的代码生成的ElementTree的一个实例:

string_data = open('file.xml')
x = ElementTree.fromstring(unicode(string_data.encode('utf-8')))

我得到以下错误:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xe8' in position 185: ordinal not in range(128)

(注:位置不是精确的,我从一个较大的取样的XML)。

如何解决呢? 谢谢

Answer 1:

并不需要解码XML的ElementTree的工作。 XML拿它自己的编码信息(默认为UTF-8)和ElementTree中做的工作对你来说,输出的Unicode:

>>> data = '''\
... <data>
...   <products>
...       <color>fumè</color>
...   </products>
... </data>
... '''
>>> x = ElementTree.fromstring(data)
>>> x[0][0].text
u'fum\xe8'

如果你的数据包含在一个文件中(像)对象,只是通过文件名或文件对象直接到ElementTree.parse()函数:

x = ElementTree.parse('file.xml')


Answer 2:

可能您在使用时这个问题跌跌撞撞请求(HTTP人类) , response.text解码默认情况下的响应,你可以使用response.content得到未解码的数据,这样的ElementTree本身可以解码。 只要记住使用正确的编码。

更多信息: http://docs.python-requests.org/en/latest/user/quickstart/#response-content



Answer 3:

您需要UTF-8字符串解码成Unicode的对象。 所以

string_data.encode('utf-8')

应该

string_data.decode('utf-8')

假设string_data实际上是一个UTF-8字符串。

因此,要总结:要想从你编码 unicode的unicode的对象的UTF-8字符串(使用UTF-8编码),并且将一个字符串为您解码使用相应的编码字符串一个Unicode对象。

有关我建议您阅读概念的更多细节绝对绝对最低每一个软件开发人员,积极必须知道的关于Unicode和字符集 (而不是Python特定的)。



Answer 4:

您是否尝试过使用parse函数,而不是打开文件...(这BTW将需要.read()后的.fromstring()工作...)

import xml.etree.ElementTree as ET

tree = ET.parse('file.xml')
root = tree.getroot()
# etc...


Answer 5:

功能open()不会返回一个string 。 而是使用open('file.xml').read()



Answer 6:

最有可能你的文件不是UTF-8。 è字符可以是从某些其他的编码, latin-1构成。



文章来源: ElementTree and unicode