У меня есть XML-файл, который указывает кодирование, и я использую UnicodeDammit для преобразования его в unicode (по причинам устройства хранения данных, я не могу сохранить его как строку). Я позже передаю его lxml, но это отказывается игнорировать кодирование, указанное в файле и анализировать его как Unicode, и это повышает исключение.
Как я могу вынудить lxml проанализировать документ? Это поведение кажется слишком строгим.
Невозможно выполнить синтаксический анализ строк Юникода И иметь объявление кодировки в строке.
Итак, либо вы сделаете его закодированной строкой (поскольку вы, очевидно, не можете сохранить ее как строку, вам придется перекодировать ее перед синтаксическим анализом. Либо вы сами сериализуете дерево как unicode с помощью lxml: etree.tostring (дерево, кодировка = unicode)
, БЕЗ объявления xml. Вы можете легко проанализировать результат снова с помощью etree.fromunicode
см. http://lxml.de/parsing.html#python-unicode-strings
Изменить: если, по-видимому, у вас уже есть строка Unicode, и вы не можете контролировать, как она была создана. Вам придется снова закодировать ее и предоставить синтаксическому анализатору кодировку, которую вы использовали:
utf8_parser = etree.XMLParser(encoding='utf-8')
def parse_from_unicode(unicode_str):
s = unicode_str.encode('utf-8')
return etree.fromstring(s, parser=utf8_parser)
Это будет убедитесь, что все, что было внутри объявления xml, игнорируется, потому что синтаксический анализатор всегда будет использовать utf-8.
По сути, решение состоит в следующем:
if isinstance(mystring, unicode):
mystring = mystring.encode("utf-8")
Серьезно. Молодец, lxml.
РЕДАКТИРОВАТЬ: Оказывается, в этом случае lxml автоматически определяет кодировку неправильно . Похоже, что мне придется вручную искать и удалять "кодировку" и "кодировку" со страницы.