Estoy tratando de analizar un archivo XML de más de 2 GB con la biblioteca lxml de Python. Desafortunadamente, el archivo XML no tiene una línea que indique la codificación de caracteres, así que tengo que configurarlo manualmente. Sin embargo, al iterar a través del archivo, todavía hay algunos caracteres extraños que aparecen de vez en cuando.¿Cómo debo manejar un XMLSyntaxError en el archivo lxml de Python al analizar un archivo XML de gran tamaño?
No estoy seguro de cómo determinar la codificación de caracteres de la línea, pero además, lxml generará un XMLSyntaxError del alcance del bucle for. ¿Cómo puedo detectar este error correctamente y tratarlo correctamente? He aquí un fragmento de código simplista:
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()
Esto a la larga produce el error:
XMLSyntaxError: PCDATA invalid Char value 31, line 1565367, column 50
Esa línea del archivo es el siguiente:
% sed -n "1565367 p" my_file.xml
<romance_copy>Ravioli Florentine. Tender Ravioli Filled With Creamy Ricotta Cheese And
La 'F' de llenado en realidad se ve así en mi terminal:
¿Ya has probado "utf-8" para una codificación? – jsbueno
@jsbueno: El problema es el carácter justo antes de la "F" en "Rellenar", que tiene un valor de 31 (decimal) o 0x1F. Este es un carácter no válido según la especificación XML, por lo que decir que use la codificación UTF-8 no hará la diferencia. La pregunta es cómo hacer que lxml lidie con los personajes malos con más elegancia (es decir, no lanzar una excepción). No encontré una opción para hacer esto en el documento lxml. –