El problema es el siguiente: Tengo un fragmento de XML, así:En lxml, ¿cómo elimino una etiqueta pero retengo todo el contenido?
<fragment>text1 <a>inner1 </a>text2 <b>inner2</b> <c>t</c>ext3</fragment>
Para el resultado, quiero eliminar todos <a>
- y <c>
-Tags, pero conservan sus -Contenido (texto), y solo childNodes ya que son. Además, el elemento <b>
no debe tocarse. El resultado debe entonces busca por lo tanto
<fragment>text1 inner<d>1</d> text2 <b>inner2</b> text3</fragment>
Por el momento, voy a volver a una muy mala pasada: Voy a etree.tostring el fragmento, eliminar las etiquetas ofensivas a través de expresiones regulares y reemplazar el fragmento original con el resultado de esta etree.fromstring (no el código real, pero debe ser algo así):
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 puedo 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 como quiero insertar texto donde antes había un nodo de elementos, no creo que pueda hacerlo.
Gracias, esto funciona a la perfección. El término "tira" no se me ocurrió, o podría haber encontrado la respuesta yo mismo :) – Thor
En serio. ¿Vas a estar en PyCon 2011? Si es así, déjame que te compre una cerveza, o cualquiera que sea tu bebida preferida. Usted acaba de hacer mi noche :) – mkelley33
También es impresionante: '' etree.strip_elements (fragmento, * ['tag1', 'tag2']) '' – mkelley33