Saltar al contenido

python lxml agregar elemento después de otro elemento

Luego de observar en varios repositorios y sitios webs de internet al terminar hallamos la respuesta que te enseñaremos más adelante.

Solución:

En lugar de agregar a contentnavsube al padre (contentdiv) y insert el nuevo div en un índice particular. Para encontrar ese índice, use contentdiv.index(contentnav)que da el índice de contentnav dentro de contentdiv. Agregar uno a eso da el índice deseado.

import lxml.etree as ET

content='''
something goes here

some contents

''' tree = ET.fromstring(content, parser=ET.HTMLParser()) contentnav = tree.find(".//div[@id='content_nav']") contentdiv = contentnav.getparent() contentdiv.insert(contentdiv.index(contentnav)+1, ET.XML("
")) print(ET.tostring(tree))

rendimientos

something goes here

some contents

Usar addprevious y addnext para anteponer y añadir hermanos.

Un lxml.etree _Element tiene dos métodos: addprevious y addnext por hacer exactamente lo que quieres.

import lxml.etree as ET

content='''
something goes here

some contents

''' tree = ET.fromstring(content, parser=ET.HTMLParser()) contentnav = tree.find(".//div[@id='content_nav']") contentnav.addnext(ET.XML("
")) print(ET.tostring(tree))

Producción:

something goes here

some contents

Creo que una función genérica que aborda la pregunta “insertar un elemento después de otro elemento” podría ser útil, incluso si es solo una reformulación de la respuesta aceptada:

def insert_after(element, new_element):
    parent = element.getparent()
    parent.insert(parent.index(element)+1, new_element)

que permite insertar un new_element después de un existente element con tan solo

insert_after(element, new_element)

Si sostienes alguna desconfianza o capacidad de regenerar nuestro escrito puedes escribir una disquisición y con gusto lo interpretaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *