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 contentnav
sube 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='''
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
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='''
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:
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.