Разбор огромных плохо закодированных файлов XML в Python

Я работаю над кодом, который анализирует внешние файлы XML -. Некоторые из этих файлов огромны, до гигабайт данных. Излишне говорить, что эти файлы нужно анализировать как поток, потому что загрузка их в память слишком неэффективна и часто приводит к проблемам OutOfMemory.

Я использовал библиотеки miniDOM, ElementTree, cElementTree и сейчас использую lxml. Прямо сейчас у меня есть работающий, довольно экономичный -сценарий, использующий lxml.etree.iterparse. Проблема в том, что некоторые файлы XML, которые мне нужно проанализировать, содержат ошибки кодирования (, которые они объявляют как UTF -8, но содержат символы, закодированные по-другому ). При использовании lxml.etree.parseэто можно исправить с помощью параметра recover=Trueпользовательского анализатора, но iterparseне принимает пользовательский анализатор. (см. также:этот вопрос)

Мой текущий код выглядит так:

from lxml import etree
events = ("start", "end")
context = etree.iterparse(xmlfile, events=events)
event, root_element = context.next() # 
for action, element in context:
    if action == 'end' and element.tag == 'item':
    # 
    root_element.clear() 

Ошибка, когда iterparseвстречается с плохим символом (, в данном случае это^Y):

lxml.etree.XMLSyntaxError: Input is not proper UTF-8, indicate encoding !
Bytes: 0x19 0x73 0x20 0x65, line 949490, column 25

Я даже не хочу расшифровывать эти данные, я могу просто бросить их.Однако я не знаю, как пропустить элемент -, который я пробовал context.nextи continueв операторах try/except.

Любая помощь будет оценена по достоинству!

Обновление

Дополнительная информация :Это строка, где iterparse терпит неудачу:

Согласно etree, ошибка возникает в байтах 0x19 0x73 0x20 0x65.
Согласно hexedit, 19 73 20 65переводится в ASCII.s e
.в этом месте должен быть апострофом (foto's ).

Я также нашел этот вопрос , который не дает решения.

11
задан Community 23 May 2017 в 11:54
поделиться