Ошибка Unicode при передаче объекта Unicode в анализатор XML - PullRequest
2 голосов
/ 16 ноября 2011

Я пытаюсь прочитать файл gzip, который содержит xml и unicode, но я получаю сообщение об ошибке. Код, который я использую:

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)

Я нашел предыдущий ответ, похожий на этот Чтение символов utf-8 из файла gzip в python , но я все еще получаю ошибку.

Есть ли проблема с анализатором xml?

(я использую Python 2.7.?)

1 Ответ

5 голосов
/ 16 ноября 2011

Вы не можете передать строку 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>

EDIT

Просто для пояснения - поток, считанный из файла 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...