12

我正在尝试使用库 xml.dom.minidom 解析一堆 xml 文件,以提取一些数据并将其放入文本文件中。大多数 XML 运行良好,但其中一些在调用 minidom.parsestring() 时出现以下错误:

UnicodeEncodeError:'ascii' 编解码器无法在位置 5189 编码字符 u'\u2019':序数不在范围内(128)

它也发生在其他一些非 ASCII 字符上。我的问题是:我在这里有什么选择?在能够解析 XML 文件之前,我是否应该以某种方式剥离/替换所有这些非英文字符?

4

5 回答 5

9

尝试解码:

> print u'abcdé'.encode('utf-8')
> abcdé

> print u'abcdé'.encode('utf-8').decode('utf-8')
> abcdé
于 2011-03-16T18:04:18.167 回答
5

如果您的字符串是“str”:

xmldoc = minidom.parseString(u'{0}'.format(str).encode('utf-8'))

这对我有用。

于 2016-07-13T05:12:55.190 回答
3

Minidom 不直接支持解析 Unicode 字符串;它在历史上一直缺乏支持和标准化。许多 XML 工具仅将字节流识别为 XML 解析器可以使用的东西。

如果您有纯文件,您应该将它们作为字节字符串(不是 Unicode!)读取并将其传递给parseString(),或者直接使用parse()它将直接读取文件。

于 2011-03-17T00:56:47.973 回答
0

我知道 OP 询问了关于解析字符串的问题,但是在通过 Document.writexml(...) 将 DOM 模型写入文件时我遇到了同样的异常。如果有这个(相关)问题的人在这里登陆,我将提供我的解决方案。

我抛出 UnicodeEncodeError 的代码如下所示:

with tempfile.NamedTemporaryFile(delete=False) as fh:
    dom.writexml(fh, encoding="utf-8")

请注意,“编码”参数仅影响 XML 标头,对数据的处理没有影响。为了修复它,我将其更改为:

with tempfile.NamedTemporaryFile(delete=False) as fh:
    fh = codecs.lookup("utf-8")[3](fh)
    dom.writexml(fh, encoding="utf-8")

这将使用encodings.utf_8.StreamWriter的实例包装文件句柄,该实例将数据处理为 UTF-8 而不是 ASCII,并且 UnicodeEncodeError 消失了。我从阅读xml.dom.minidom.Node.toprettyxml(...)的源代码中得到了这个想法。

于 2015-10-27T22:36:35.837 回答
-2

我几次遇到这个错误,我处理它的hacky方法就是这样做:

def getCleanString(word):   
   str = ""
   for character in word:
      try: 
         str_character = str(character)
         str = str + str_character
      except:
         dummy = 1 # this happens if character is unicode
   return str

当然,这可能是一种愚蠢的做法,但它可以为我完成工作,并且不会花费我任何速度。

于 2011-03-17T01:05:10.827 回答