¿Cómo convertir un archivo XML a un buen dataframe pandas?

Supongamos que tengo un XML como este:

                    

Me gustaría leer este archivo XML y convertirlo en un DataFrame de pandas:

 key type language feature web data e95324a9a6c790ecb95e46cf15bE232ee517651 XXX EN xx www.foo_bar_exmaple.com A large text with lots of strings and punctuations symbols [...] e95324a9a6c790ecb95e46cf15bE232ee517651 XXX EN xx www.foo_bar_exmaple.com A large text with lots of strings and punctuations symbols [...] 19e71144c50a8b9160b3cvdf2324f0955e906fce XXX EN xx www.foo_bar_exmaple.com A large text with lots of strings and punctuations symbols [...] 21d4af9021a174f61b8erf284606c74d9e42 XXX EN xx www.foo_bar_exmaple.com A large text with lots of strings and punctuations symbols [...] 28a45eb2460823499763d70vdf9ca00ddbb665 XXX EN xx www.foo_bar_exmaple.com A large text with lots of strings and punctuations symbols [...] 

Esto es lo que ya intenté, pero estoy recibiendo algunos errores y probablemente haya una forma más eficiente de hacer esta tarea:

 from lxml import objectify import pandas as pd path = 'file_path' xml = objectify.parse(open(path)) root = xml.getroot() root.getchildren()[0].getchildren() df = pd.DataFrame(columns=('key','type', 'language', 'feature', 'web', 'data')) for i in range(0,len(xml)): obj = root.getchildren()[i].getchildren() row = dict(zip(['key','type', 'language', 'feature', 'web', 'data'], [obj[0].text, obj[1].text])) row_s = pd.Series(row) row_s.name = i df = df.append(row_s) 

¿Podría alguien proporcionarme un mejor enfoque para este problema?

Puede usar fácilmente xml (de la biblioteca estándar de Python) para convertir a un pandas.DataFrame . Esto es lo que haría (al leer un archivo, reemplace xml_data con el nombre de su archivo u objeto):

 import pandas as pd import xml.etree.ElementTree as ET import io def iter_docs(author): author_attr = author.attrib for doc in author.iter('document'): doc_dict = author_attr.copy() doc_dict.update(doc.attrib) doc_dict['data'] = doc.text yield doc_dict xml_data = io.StringIO(u'''\                     ''') etree = ET.parse(xml_data) #create an ElementTree object doc_df = pd.DataFrame(list(iter_docs(etree.getroot()))) 

Si hay varios autores en su documento original o la raíz de su XML no es un author , entonces agregaría el siguiente generador:

 def iter_author(etree): for author in etree.iter('author'): for row in iter_docs(author): yield row 

y cambie doc_df = pd.DataFrame(list(iter_docs(etree.getroot()))) a doc_df = pd.DataFrame(list(iter_author(etree)))

Eche un vistazo al tutorial de ElementTree proporciona en la documentación de la biblioteca xml .

Aquí hay otra forma de convertir un xml a un dataframe pandas. Por ejemplo, tengo un xml de análisis de una cadena, pero esta lógica es válida también al leer el archivo.

 import pandas as pd import xml.etree.ElementTree as ET xml_str = '\n200' etree = ET.fromstring(r.content) dfcols = ['id', 'name'] df = pd.DataFrame(columns=dfcols) for i in etree.iter(tag='data'): df = df.append( pd.Series([i.get('id'), i.get('name')], index=dfcols), ignore_index=True) df.head() 

Si el tamaño del archivo <1,00,000 filas, probablemente pueda guardarlo como un archivo Excel o Csv dentro de MS Excel y leerlo fácilmente con cualquiera de estos

import pandas pandas.read_csv() or pandas.read_excel()