【问题标题】:Unable to decode byte无法解码字节
【发布时间】:2013-12-19 19:25:04
【问题描述】:

所以,我正在获取一些 xml 数据。一个这样的例子如下:

xmlString = '<location>san diego, ça</location>'

这目前是一个字符串。我现在需要使用 ElementTree 的 fromstring() 方法将其转换为 XML 对象。 导入如下:

import xml.etree.ElementTree as ET

方法调用为:

xml = ET.fromstring(xmlString)

我不断收到错误,说:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position xxx: 
ordinal not in range(128)

为了解决这个问题,我查看了 StackOverflow 以及 Python Docs。

似乎建议对字符串进行编码和解码。

xmlString = xmlString.encode('utf-8', 'ignore')
xmlString = xmlString.decode('ascii', 'ignore')

忽略是针对错误,但它们仍然会出现。这是在将 xmlString 转换为 xml 对象之前完成的。但是仍然出现错误!

有什么想法吗?

完整代码为:

xmlString = '<?xml version="1.0" encoding="UTF-8"?><o><location>san diego, ça</location>
</o>'
xmlString = xmlString.encode('utf-8', 'ignore')
xmlString = xmlString.decode('ascii', 'ignore')
xml = ET.fromstring(xmlString)

使用 Python 2.7

【问题讨论】:

  • 是的。分享代码和回溯。
  • @IgnacioVazquez-Abrams 我写了一个可以在命令行中使用的 sn-p
  • XML 通常需要 UTF-8 编码,fromstring() 需要你传入 byte string(不是 unicode)。尝试将 UTF-8 重新编码为 ASCII 是行不通的。
  • @MartijnPieters 但即使我删除了 decode('ascii', 'ignore') 它在对字符串本身进行编码时也会中断
  • 这是 Python 2 还是 Python 3?

标签: python xml elementtree non-ascii-characters python-unicode


【解决方案1】:

你打电话给str.encode(); Python 2 字符串已经 编码,因此 Python 尝试做正确的事情并首先 decodeunicode,然后它可以将值编码回为您的字节串。

此隐式解码使用默认编解码器ASCII

>>> '<?xml version="1.0" encoding="UTF-8"?><o><location>san diego, ça</location></o>'.encode('utf8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 62: ordinal not in range(128)

请注意,我调用了.encode(),但例外是UnicodeDecodeError; Python 首先在这里解码

但是,因为ET.fromstring() 已经想要 UTF-8 编码字节,您根本不需要重新编码该值

如果您在解析字符串值时遇到问题,请确保您在文本编辑器中使用正确的编解码器 UTF8 保存了 Python 源代码。

【讨论】:

  • 谢谢@MartijnPieters 感谢您的帮助。我发现,通过删除编码和解码,它确实有效。但是偶尔我确实会发现一个似乎会破坏它的字符,因此我引导自己进行编码和解码。我认为这可能是 ElementTree 的问题。例如,我遇到了 Ø 的问题,它是一个 UTF-8 字符:utf8-chartable.de。但是,当使用 Ø 的多个元素时,我无法使用 ET.fromString 方法。
  • @redrubia: XML 数据从何而来?可能是该数据中存在错误,或者 XML 标头中的编解码器声明不正确,或者其他此类错误。 ElementTree 可以很好地处理正确编码的 XML。
  • @redrubia:接下来,也可能是您没有正确处理 ElementTree 的 输出;您将获得 Unicode 值,如果您要打印这些值或写入文件,则需要确保正确处理编码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-13
  • 2016-08-03
  • 1970-01-01
  • 2013-08-17
  • 2011-06-29
相关资源
最近更新 更多