传递Unicode对象给XML解析器时发生Unicode错误
我正在尝试读取一个包含xml和unicode的gzip文件,但遇到了错误。我使用的代码是:
import gzip
import xml
path = "index.mjml.gz"
gzFile = gzip.open(path, mode='r')
gzContents = gzFile.read()
gzFile.close()
unicodeContents = gzContents.encode('utf-8')
xmlContent = xml.dom.minidom.parseString(unicodeContents)
# Do stuff with xmlContent
当我运行这段代码时,出现了以下错误(错误发生在以 xmlContent
开头的那一行)
/Library/Frameworks/EPD64.framework/Versions/7.1/lib/python2.7/xml/dom/minidom.pyc in parseString(string, parser)
1922 if parser is None:
1923 from xml.dom import expatbuilder
-> 1924 return expatbuilder.parseString(string)
1925 else:
1926 from xml.dom import pulldom
/Library/Frameworks/EPD64.framework/Versions/7.1/lib/python2.7/xml/dom/expatbuilder.pyc in parseString(string, namespaces)
938 else:
939 builder = ExpatBuilder()
--> 940 return builder.parseString(string)
941
942
/Library/Frameworks/EPD64.framework/Versions/7.1/lib/python2.7/xml/dom/expatbuilder.pyc in parseString(self, string)
221 parser = self.getParser()
222 try:
--> 223 parser.Parse(string, True)
224 self._setup_subset(string)
225 except ParseEscape:
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 1141336: ordinal not in range(128)
我找到了一些类似的答案,比如这个 在Python中读取gzip文件中的utf-8字符,但我仍然遇到错误。
是不是xml解析器有问题?
(我使用的是Python 2.7.?)
1 个回答
5
你不能直接把一个unicode字符串传给 xml.dom.minidom.parseString
。
你需要传一个正确编码的字节字符串:
>>> import xml.dom.minidom as xmldom
>>>
>>> source = u"""\
... <?xml version="1.0" encoding="utf-8"?>
... <root><text>Σὲ γνωρίζω ἀπὸ τὴν κόψη</text></root>
... """
>>> doc = xmldom.parseString(source.encode('utf-8'))
>>> print doc.getElementsByTagName('text')[0].toxml()
<text>Σὲ γνωρίζω ἀπὸ τὴν κόψη</text>
编辑
为了更清楚一点,从gzipped的xml文件中读取的流应该直接传给解析器,而不需要尝试去编码或解码:
import gzip
import xml
path = "index.mjml.gz"
gzFile = gzip.open(path, mode='r')
gzContents = gzFile.read()
gzFile.close()
xmlContent = xml.dom.minidom.parseString(gzContents)
解析器会从文件开头的xml声明中读取编码信息(如果没有声明,它会默认使用“utf-8”)。然后它会用这个信息把内容解码成unicode。