繁体   English   中英

ElementTree 和 unicode

[英]ElementTree and unicode

我在 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 中采样)。

如何解决? 谢谢

您可能在使用Requests (HTTP for Humans)时偶然发现了这个问题,默认情况下response.text解码响应,您可以使用response.content获取未解码的数据,因此 ElementTree 可以对其进行解码。 请记住使用正确的编码。

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

您需要将 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 特定)的绝对最小值

并不需要解码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')

您是否尝试过使用parse函数,而不是打开文件...(顺便说一句,在它之后需要.read()才能使.fromstring()工作...)

import xml.etree.ElementTree as ET

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

您的文件很可能不是 UTF-8。 è字符可以来自其他一些编码,例如latin-1

函数open()不返回string 而是使用open('file.xml').read()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM