如何使用minidom解析unicode字符串?

时间:2011-03-16 18:02:48

标签: python unicode minidom

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

  

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

它也适用于其他一些非ascii字符。我的问题是:我有什么选择?在解析XML文件之前,我是否应该以某种方式删除/替换所有非英文字符?

5 个答案:

答案 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

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