我正在尝试使用库xml.dom.minidom解析一堆xml文件,以提取一些数据并将其放入文本文件中。大多数XML都运行良好,但对于其中一些XML,我在调用minidom.parsestring()时遇到以下错误:
UnicodeEncodeError:'ascii'编解码器无法编码位置5189中的字符u'\ u2019':序数不在范围内(128)
它也适用于其他一些非ascii字符。我的问题是:我有什么选择?在解析XML文件之前,我是否应该以某种方式删除/替换所有非英文字符?
答案 0 :(得分:9)
尝试解码它:
> print u'abcdé'.encode('utf-8')
> abcdé
> print u'abcdé'.encode('utf-8').decode('utf-8')
> abcdé
答案 1 :(得分:3)
如果你的字符串是'str':
<?php
namespace Myapp;
class Notifyer
{
public function sendInfo(Order $order){...}
}
这对我有用。
答案 2 :(得分:2)
Minidom不直接支持解析Unicode字符串;这是历史上一直支持和标准化不足的东西。许多XML工具只将字节流识别为XML解析器可以使用的东西。
如果您有普通文件,您应该以字节字符串(而不是Unicode!)读取它们并将其传递给parseString()
,或者只使用将直接读取文件的parse()
。
答案 3 :(得分:0)
我知道O.P.询问解析字符串,但是在通过Document.writexml(...)将 DOM模型写入文件时,我遇到了同样的异常。如果有(相关)问题的人来到这里,我会提供我的解决方案。
我抛出UnicodeEncodeError的代码如下所示:
with tempfile.NamedTemporaryFile(delete=False) as fh: dom.writexml(fh, encoding="utf-8")
请注意,“encoding”参数仅影响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(...)的来源中得到了这个想法。
答案 4 :(得分:-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
当然,这可能是一种愚蠢的做法,但它为我完成了工作,并没有花费任何速度。