Подтвердить что ты не робот

ElementTree и unicode

У меня есть этот char в XML файле:

<data>
  <products>
      <color>fumè</color>
  </product>
</data>

Я пытаюсь создать экземпляр ElementTree со следующим кодом:

string_data = open('file.xml')
x = ElementTree.fromstring(unicode(string_data.encode('utf-8')))

и я получаю следующую ошибку:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xe8' in position 185: ordinal not in range(128)

(ПРИМЕЧАНИЕ: позиция не является точной, я выбрал xml из более крупного).

Как его решить? Благодаря

4b9b3361

Ответ 1

Вам не нужно расшифровывать XML для ElementTree для работы. XML несет в себе собственную информацию о кодировке (по умолчанию используется UTF-8), а ElementTree работает для вас, выводя unicode:

>>> data = '''\
... <data>
...   <products>
...       <color>fumè</color>
...   </products>
... </data>
... '''
>>> x = ElementTree.fromstring(data)
>>> x[0][0].text
u'fum\xe8'

Если ваши данные содержатся в объекте (например), просто передайте имя файла или файл непосредственно функции ElementTree.parse():

x = ElementTree.parse('file.xml')

Ответ 2

Возможно, вы наткнулись на эту проблему при использовании Запросов (HTTP для людей), response.text декодирует ответ по умолчанию, вы можете использовать response.content для получения незакодированные данные, поэтому ElementTree может его декодировать. Не забудьте использовать правильную кодировку.

Дополнительная информация: http://docs.python-requests.org/en/latest/user/quickstart/#response-content

Ответ 3

Вам нужно декодировать строки utf-8 в объект unicode. Так

string_data.encode('utf-8')

должен быть

string_data.decode('utf-8')

Предполагая, что string_data на самом деле является строкой utf-8.

Итак, чтобы суммировать: Чтобы получить строку utf-8 из объекта unicode, вы кодируете юникод (используя кодировку utf-8) и превращаете строку в объект unicode, вы декодировать строку, используя соответствующую кодировку.

Подробнее о концепциях, которые я предлагаю прочитать Абсолютный минимум Каждый разработчик программного обеспечения Абсолютно, положительно должен знать о Unicode и наборах символов (не Python специфические).

Ответ 4

Функция open() не возвращает string. Вместо этого используйте open('file.xml').read().

Ответ 5

Скорее всего, ваш файл не UTF-8. è символ может быть от какой-либо другой кодировки, например, latin-1.

Ответ 6

Вы пытались использовать функцию parse вместо открытия файла... (для чего BTW потребует .read() после того, как для .fromstring() будет работать...)

import xml.etree.ElementTree as ET

tree = ET.parse('file.xml')
root = tree.getroot()
# etc...