En lxml, ¿cómo elimino una etiqueta pero conservo todo el contenido?
El problema es este: tengo un fragmento XML como este:
<fragment>text1 <a>inner1 </a>text2 <b>inner2</b> <c>t</c>ext3</fragment>
Para el resultado, quiero eliminar todo<a>
- y<c>
-Etiquetas, pero conservan su contenido (de texto) y los nodos secundarios tal como son. También el<b>
-El elemento debe dejarse intacto. El resultado debería verse así
<fragment>text1 inner<d>1</d> text2 <b>inner2</b> text3</fragment>
Por el momento, volveré a un truco muy sucio: etree.tostring el fragmento, eliminaré las etiquetas ofensivas a través de regex y reemplazaré el fragmento original con el resultado etree.fromstring de esto (no el código real, pero debería ir algo como esto):
from lxml import etree
fragment = etree.fromstring("<fragment>text1 <a>inner1 </a>text2 <b>inner2</b> <c>t</c>ext3</fragment>")
fstring = etree.tostring(fragment)
fstring = fstring.replace("<a>","")
fstring = fstring.replace("</a>","")
fstring = fstring.replace("<c>","")
fstring = fstring.replace("</c>","")
fragment = etree.fromstring(fstring)
Sé que probablemente pueda usar xslt para lograr esto, y sé que lxml puede hacer uso de xslt, pero ¿tiene que haber un enfoque nativo más lxml?
Como referencia: he intentado llegar allí con element.replace de lxml, pero dado que quiero insertar texto donde antes había un nodo de elemento, no creo que pueda hacerlo.