Cómo volcar Python lxml etree
lxml es la biblioteca más rica en funciones y fácil de usar para procesar XML y HTML en el lenguaje Python.
lxml es un enlace Pythonic para las bibliotecas C libxml2 y libxslt. Es único porque combina la velocidad y la integridad funcional de estas bibliotecas con los perfiles API de Python. Es compatible con la API ElementTree, pero mejor.
Programar con libxml2 puede ser tan aterrador como ser abrazado por un extraño que parece poder cumplir todos tus sueños más locos, pero en el fondo te sigue advirtiendo que corres el riesgo de estar condenado de la peor manera posible. , ahí es donde entra lxml.
Este es un tutorial sobre el procesamiento de XML con lxml.etree que proporciona una breve introducción a los conceptos principales de la API ElementTree, así como algunas mejoras simples que pueden facilitar su carrera de programación.
Primero está la importación de lxml.etree: from?lxml?import?etree
Para ayudar con la portabilidad del código, los ejemplos de este tutorial indicarán explícitamente que parte de la API es lxml.etree Implementación de la API ElementTree (definida por la biblioteca ElementTree de Fredrik Lundh).
Element es la clase contenedora principal de la API ElementTree y la mayoría de las funciones del árbol XML se implementan a través de esta clase.
SubElement(raíz, "child2")
>>>child3?=?etree.tostring(root,?pretty_print=True))
Para que el acceso a estos nodos secundarios sea más fácil e intuitivo, el elemento simula una cadena normal de Python: >>>?child? root[0]>>>?print(child.tag)
child1
>>>?print(len(root))
> >> ?root.index(root[1])?#?lxml.etree?only
>>>?children?=?list(root)>>>?for?child?in? ...print(child.tag)child1child2
child3
>>>>>root.insert(0,?etree.Element("child0"))> >>> >>>?start?=?root[:1] >>>?end=?root[-1:]>>>?print(start[0].tag)child0>>>?print(end [0] .tag)child3
También puedes determinar si un elemento tiene nodos secundarios en función de su valor real:
if?root:#?this?no more?works!print("The?root?element?has?children")
Usar len(element) es más intuitivo y menos propenso a errores: >>>?print( etree.element(root) )? #?prueba?si?es?algún?tipo?de?Elemento
Verdadero
>>>?if?len(root):?#Prueba si hay descendientes p>
...print("¿El?elemento?raíz?tiene?hijos")
¿El?elemento?raíz?>>>?para?niño?en?raíz:. print(child.tag)child0child1child2child3>>>?root[0]? =?root[-1]?#elemento movido>>>?for?child?in?root: ... ?print(child.tag)child3child1child2 >>>?l?=?[0,?1,?2,?3]>>>?l[0]? =?l[-1]>>>?l[3,?1,? ?3]
>>>?root?is?root[0].getparent()?#Si desea copiar un elemento en una ubicación diferente en lxml.etree, considere usar Python El módulo de copia en la biblioteca estándar crea una copia profunda separada:>>>;from?copy?import?deepcopy&
gt;>>;elemento?=?etree.Element("neu")?Element("neu")>>>?element.append(?deepcopy(raíz[1])?) >>?print(elemento[0 ].tag)child1>>>?print([?tag?for?c?in?root?])['child3',?etree.Element("root",?interesting="totally")
>>>?etree.string(root)
b'
Los atributos son pares clave-valor desordenados, por lo que se puede manejar usando elementos similares a la interfaz del diccionario: >>>?print(root.get("interesting"))
totalmente
>>>?print(root .get ("hola"))
Ninguno
>>>?root.set("hola",?" Huhu")
>>> ?imprimir (root.get("hola"))
Huhu
>>?etree.tostring(root)
b'
>>>?sorted(root.keys())
['hola',? interesante'] p>
>>>?para?nombre,?valor?en?sorted(root.items()):
...print('%s?=?%r'?% ? ( nombre,?valor))
hola?=?' Huhu'
interesante?=?'
Si necesita obtener un objeto dict, puedes usar el atributo atributos: >>>?attributes?=?root.attribute
>>>?print(attributes["interesting"])
totalmente
>>>?print(attributes.get("no-such-attribute"))
Ninguno
>>>?attributes["hola"] =? " Guten?Guten?Etiqueta"
>>>?print(atributos["hola"])
Guten?Etiqueta
>>> ?print( root.get("hello"))
Guten?Tag
Dado que attrib es un objeto tipo dict respaldado por el elemento mismo, esto significa que cualquier cambio afectará a attrib y vice. viceversa. Esto también significa que el árbol XML permanece en la memoria mientras alguno de los atributos del elemento siga en uso.
Se puede obtener una instantánea de atributo independiente del árbol XML mediante: >>>?d?=?dict(root.attrib)
>>>?sorted(d.items())
[('hola', ?' Guten?Tag'),? ('interesante',?' totalmente')]