Python-LXML: ValueError: все строки должны быть совместимы с XML [duplicate]

Я только что прошел ту же проблему и нашел хорошее решение в руководствах PHP.

Я изменил всю свою кодировку файла на UTF8, а затем по умолчанию на мое соединение. Это решило все проблемы.

if (!$mysqli->set_charset("utf8")) {
    printf("Error loading character set utf8: %s\n", $mysqli->error);
} else {
   printf("Current character set: %s\n", $mysqli->character_set_name());
}

Просмотреть источник

5
задан dustin999 16 June 2013 в 22:53
поделиться

2 ответа

Если текст содержит данные, отличные от ascii, тогда вы должны указать его как строку Юникода для el.text.

Поскольку ответ @Abbasov Alexander показывает, что вы можете сделать это, используя Юникодный литерал u''. Python не вызывает исключения, поэтому я предполагаю, что вы объявили кодировку символов вашего исходного файла Python (например, используя комментарий # coding: utf-8 вверху). Эта кодировка определяет, как Python интерпретирует не-ascii-символы в источнике, он не имеет отношения к кодировке, которую вы используете для сохранения xml в файл.

Если текст уже находится в переменной и вы не преобразовали это еще до Unicode, вы можете сделать это, используя text.decode(text_encoding) (text_encoding могут быть не связаны с исходной кодировкой Python).

Запутанным битом может быть то, что el.text (как оптимизация) возвращает bytestring на Python 2 для чистых данных ascii. Это нарушает правило, что вы не должны смешивать байты и строки Unicode. Хотя он должен работать, если sys.getdefaultencoding() возвращает кодировку на основе ascii, как и в большинстве случаев.

Чтобы сохранить xml, передайте любую кодировку символов, которая вам понадобится для функций tostring() или ElementTree.write(). Опять же, это кодирование не связано с другими уже упомянутыми кодировками.

В общем, используйте Unicode sandwich : декодируйте байты в Unicode, как только вы их получите, работайте с текстом Unicode внутри вашего программы, кодировать в байты как можно позже, когда вам нужно отправить текст с помощью API, который не поддерживает Unicode (файлы, сеть).

3
ответ дан Community 26 August 2018 в 14:26
поделиться

Если у вас есть версия python & lt; 3 вы можете попробовать: el.text = u'Disponible à partir du 1er Octobre'

5
ответ дан Abbasov Alexander 26 August 2018 в 14:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: