Разбор огромных, плохо закодированных файлов 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() # <items>
for action, element in context:
    if action == 'end' and element.tag == 'item':
    # <parse>
    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 в попытках / кроме заявлений.

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

Update

Некоторая дополнительная информация: Это строка, в которой происходит сбой iterparse:

<description><![CDATA:[musea de la photographie fonds mercator. Met meer dan 80.000 foto^Ys en 3 miljoen negatieven is het Muse de la...]]></description>

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

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

Ответы на вопрос(4)

Ваш ответ на вопрос