Sto cercando di analizzare un file XML che supera i 2 GB con la libreria lxml di Python. Sfortunatamente, il file XML non ha una riga che indica la codifica dei caratteri, quindi devo impostarlo manualmente. Durante l'iterazione del file, tuttavia, ci sono ancora strani personaggi che emergono una volta ogni tanto.Come dovrei gestire un XMLSyntaxError nel lxml di Python mentre analizzo un grande file XML?
Non sono sicuro di come determinare la codifica dei caratteri della linea, ma inoltre, lxml genererà un errore XMLSyntaxError dall'ambito del ciclo for. Come posso rilevare correttamente questo errore e gestirlo correttamente? Ecco un frammento di codice semplicistica:
from lxml import etree
etparse = etree.iterparse(file("my_file.xml", 'r'), events=("start",), encoding="CP1252")
for event, elem in etparse:
if elem.tag == "product":
print "Found the product!"
elem.clear()
Questo alla fine genera l'errore:
XMLSyntaxError: PCDATA invalid Char value 31, line 1565367, column 50
Quella riga del file è simile al seguente:
% sed -n "1565367 p" my_file.xml
<romance_copy>Ravioli Florentine. Tender Ravioli Filled With Creamy Ricotta Cheese And
La 'F' di pieno effettivamente appare come questo nel mio terminale:
Hai già provato semplicemente "utf-8" per una codifica? – jsbueno
@jsbueno: il problema è il carattere appena prima della "F" in "Filled", che ha un valore di 31 (decimale) o 0x1F. Questo è un carattere non valido per la specifica XML, quindi dirlo di usare la codifica UTF-8 non farà la differenza. La domanda è come ottenere lxml per affrontare i personaggi cattivi con più grazia (ad esempio, non lanciare un'eccezione). Non ho trovato un'opzione per farlo nel documento lxml. –