¿Hay una manera más Pythonic acceder a los elementos secundarios de los padres que usan lxml

StackOverflow https://stackoverflow.com/questions/3106658

  •  29-09-2019
  •  | 
  •  

Pregunta

Me estoy metiendo en documentos XBRL tratando de conseguir mi cabeza alrededor de cómo extraer y utilizar los datos con eficacia. Una cosa que he estado luchando con es asegurarse de que utilizo la información de contexto correctamente. A continuación se muestra un fragmento de uno de los documentos estoy jugando con (esto es de Mattel últimas 10-K)

Quiero ser capaz de cobrar de manera eficiente los pares de valores clave de contexto, ya que son importantes para ayudar a alinear los datos 'reales'' He aquí un ejemplo de un elemento de contexto

- <context id="eol_PE6050----0910-K0010_STD_0_20091231_0">
  - <entity>
     <identifier scheme="http://www.sec.gov/CIK">0000063276</identifier> 
   </entity>
  - <period>
   <instant>2009-12-31</instant> 
   </period>
   </context>

Cuando empecé este pensé que si había una relación padre-hijo que debería ser capaz de obtener los atributos, las llaves, los valores y el texto de todos los niños directamente de la aplicación de un método (?) A los padres. Pero los niños conservan su independencia a pesar de que se pueden encontrar de los padres. Lo que quiero decir es que si los niños tienen atributos, claves, valores y u Texto esas construcciones no se puede acceder directamente desde la matriz en lugar usted tiene que determinar / identificar a los niños y de los niños el acceso a los datos o metadatos que se necesita.

No estoy totalmente seguro de por qué este bloque de código es un buen punto de partida:

 from lxml import etree
 test_tree=etree.parse(r'c:\temp\test_xml\mat-20091231.xml')
 tree_list=[p for p in test_tree.getiterator() 

así que mi tree_list es una lista de los elementos que se determinaron de existir en mi archivo XML
Debido a que sólo había 664 artículos en mi tree_list hice la muy mala suposición de que todos los elementos dentro de uno de los padres fueron subsumidos en el padre así que seguí intentando acceder a la entidad, y punto e instante haciendo referencia sólo a los elementos (no son sus hijos)

for each in tree_list:
    if 'context' in each.tag:
        contextlist.append(each)

Eso es Seguí la aplicación de diferentes métodos a los elementos de la contextlist y obtuve realmente frustrado. Por último, mientras que yo estaba escribiendo la pregunta que yo estaba tratando de conseguir un poco de ayuda para saber qué método me daría la entidad y el período que decidí probar

children=[c for c in contextlist[0].iterchildren()]

así que mis hijos tiene lista de todos los niños del primer elemento de mi contextlist

Uno de los niños es el elemento de entidad, el otro es el elemento periodo

Ahora, debe ser que cada uno de esos niños tienen un niño, el elemento de entidad tiene un elemento hijo identificador y el elemento tiene un período elemento hijo instantánea Esto se está volviendo mucho más complicado de lo que parecía esta mañana.

Tengo que saber los detalles que se reportan por los elementos de contexto para evaluar correctamente y operan sobre los datos reales. Parece como si tuviera que probar cada uno de los hijos de los elementos de contexto ¿Hay una manera más rápida y eficiente para conseguir esos valores? Reformulado, ¿hay una manera de tener algún elemento y crear una estructura de datos que contiene todos sus hijos y nietos, etc sin tener que hacer una buena cantidad de else try

Una vez que los tengo que puedo empezar a construir un diccionario de datos y los elementos de datos a asignar entradas en particular en función del contexto. Por eso, conseguir los elementos de contexto de manera eficiente y completo es fundamental para mi tarea.

¿Fue útil?

Solución

Uso de la interfaz elemento de árbol (que LXML también soportes), getIterator itera sobre todos los nodos en el subárbol con raíces en el elemento actual.

Así, [list(c.getiterator()) for c in contextlist] le da la lista de listas que desea (o es posible que desee mantener c en la lista resultante para evitar tener que comprimir con contextlist más tarde, es decir diretly hacer una lista de tuplas [(c, list(c.getiterator())) for c in contextlist], dependiendo de su uso previsto ).

Nota de paso que un listcomp de la forma exacta [x for x in whatever] no tiene mucho sentido -. list(whatever) uso, en cambio, a su vez cualquier otro iterable en una lista

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top