Как разобрать строки юникода с минидомом? - PullRequest
11 голосов
/ 16 марта 2011

Я пытаюсь проанализировать кучу файлов xml с помощью библиотеки xml.dom.minidom, извлечь некоторые данные и поместить их в текстовый файл.Большинство XML-файлов работают хорошо, но для некоторых из них я получаю следующую ошибку при вызове minidom.parsestring ():

UnicodeEncodeError: кодек «ascii» не может кодировать символ u '\ u2019'в позиции 5189: порядковый номер не в диапазоне (128)

Это происходит и для некоторых других символов, не относящихся к ascii.Мой вопрос: каковы мои варианты здесь?Должен ли я каким-то образом удалить / заменить все эти неанглийские символы, прежде чем я смогу проанализировать файлы XML?

Ответы [ 5 ]

9 голосов
/ 16 марта 2011

Попробуйте расшифровать его:

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

> print u'abcdé'.encode('utf-8').decode('utf-8')
> abcdé
3 голосов
/ 13 июля 2016

Если ваша строка 'str':

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

Это сработало для меня.

2 голосов
/ 17 марта 2011

Minidom не поддерживает синтаксический анализ строк Unicode;это то, что исторически имело плохую поддержку и стандартизацию.Многие инструменты XML распознают только потоки байтов как то, что может использовать синтаксический анализатор XML.

Если у вас есть простые файлы, вы должны либо прочитать их как строки байтов (не Unicode!) И передать их в parseString(), либопросто используйте parse(), который будет читать файл напрямую.

0 голосов
/ 28 октября 2015

Я знаю, что ОП спрашивал о разборе строк, но у меня было то же исключение при записи модели DOM в файл через Document.writexml (...).Если люди с этой (связанной) проблемой приземляются здесь, я предложу свое решение.

Мой код, который вызывал 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 (...) .

0 голосов
/ 17 марта 2011

Я сталкиваюсь с этой ошибкой несколько раз, и мой хакерский способ справиться с ней - это просто сделать:работа сделана для меня, и ничего не стоит мне в скорости.

...