0

Итак, я получаю некоторые данные xml. Одним из таких примеров является следующее:Невозможно декодировать байт

xmlString = '<location>san diego, ça</location>' 

В настоящее время это строка. Теперь мне нужно преобразовать его в объект XML, используя метод ElementTree, fromstring(). импорта выглядит следующим образом:

import xml.etree.ElementTree as ET 

Вызов метод:

xml = ET.fromstring(xmlString) 

я продолжал получать ошибки, говоря:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position xxx: 
ordinal not in range(128) 

Для того, чтобы справиться с этим я выглядел довольно немного над StackOverflow, а также с документами Python.

Представляется, что необходимо кодировать и декодировать строку.

xmlString = xmlString.encode('utf-8', 'ignore') 
xmlString = xmlString.decode('ascii', 'ignore') 

Ошибка игнорируется, но они по-прежнему возникают. Это делается до преобразования xmlString в объект xml. Но все же ошибка возникает!

Любые идеи?

Полный код:

xmlString = '<?xml version="1.0" encoding="UTF-8"?><o><location>san diego, ça</location> 
</o>' 
xmlString = xmlString.encode('utf-8', 'ignore') 
xmlString = xmlString.decode('ascii', 'ignore') 
xml = ET.fromstring(xmlString) 

Использование Python 2.7

+0

Да. Разделите код и трассировку. –

+0

@ IgnacioVazquez-Abrams Я написал фрагмент, который можно использовать в командной строке – redrubia

+0

Обычно, как ожидается, XML кодируется в кодировке UTF-8, 'fromstring()' ожидает, что вы передадите * байтовую строку * (не unicode). Попытка перекодировать UTF-8 как ASCII не будет работать. –

ответ

1

Вы звоните str.encode(); Строки Python 2: уже закодированы, поэтому Python пытается сделать правильные вещи и сначала декодирует до unicode, чтобы затем он мог кодировать значение обратно к байтовой строке для вас.

Это неявное декодирование осуществляется с помощью кодека по умолчанию, ASCII:

>>> '<?xml version="1.0" encoding="UTF-8"?><o><location>san diego, ça</location></o>'.encode('utf8') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 62: ordinal not in range(128) 

Обратите внимание, что я назвал .encode(), но исключение составляет UnicodeDecodeError; Python был декодирование здесь первый.

Однако, поскольку ET.fromstring() уже хочет UTF-8 закодированных байт, вам не нужно перекодировать значение на всех.

Если вы видите проблемы с разбором строкового значения, убедитесь, что вы сохранили исходный код Python с помощью правого кодека UTF8 из текстового редактора.

+0

Спасибо @MartijnPieters Я ценю вашу помощь. То, что я нашел, - это удаление кода и декодирование, оно работает в основном. Однако иногда я нахожу символ, который, кажется, нарушает его, поэтому я повел себя в кодирование и декодирование. Я думаю, что это может быть проблема с ElementTree. Например, у меня возникли проблемы с Ø, который является символом UTF-8: http://www.utf8-chartable.de/. Однако при использовании нескольких элементов Ø я не смог использовать метод ET.fromString. – redrubia

+0

@redrubia: Откуда берутся данные XML *? Возможно, что в этих данных есть ошибки, или кодек объявлен неправильно в заголовке XML или других подобных ошибках. ElementTree может обрабатывать правильно кодированный XML просто отлично. –

+0

@redrubia: Далее, вы также можете не правильно обрабатывать * выход * из ElementTree; вы получите значения Unicode, и если вы печатаете их или записываете в файл, вы должны убедиться, что кодирование обрабатывается правильно. –

Смежные вопросы