Существует ли способ вынудить lxml проанализировать строки Unicode, которые указывают кодирование в теге?

У меня есть XML-файл, который указывает кодирование, и я использую UnicodeDammit для преобразования его в unicode (по причинам устройства хранения данных, я не могу сохранить его как строку). Я позже передаю его lxml, но это отказывается игнорировать кодирование, указанное в файле и анализировать его как Unicode, и это повышает исключение.

Как я могу вынудить lxml проанализировать документ? Это поведение кажется слишком строгим.

16
задан Stavros Korokithakis 4 August 2010 в 04:13
поделиться

2 ответа

Невозможно выполнить синтаксический анализ строк Юникода И иметь объявление кодировки в строке. Итак, либо вы сделаете его закодированной строкой (поскольку вы, очевидно, не можете сохранить ее как строку, вам придется перекодировать ее перед синтаксическим анализом. Либо вы сами сериализуете дерево как 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.

19
ответ дан 30 November 2019 в 21:35
поделиться

По сути, решение состоит в следующем:

if isinstance(mystring, unicode):
    mystring = mystring.encode("utf-8")

Серьезно. Молодец, lxml.

РЕДАКТИРОВАТЬ: Оказывается, в этом случае lxml автоматически определяет кодировку неправильно . Похоже, что мне придется вручную искать и удалять "кодировку" и "кодировку" со страницы.

5
ответ дан 30 November 2019 в 21:35
поделиться
Другие вопросы по тегам:

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