Python y ElementTree: devuelven “XML interno” excluyendo el elemento padre

En Python 2.6 utilizando ElementTree, ¿cuál es una buena manera de obtener el XML (como una cadena) dentro de un elemento en particular, como lo que puede hacer en HTML y javascript con innerHTML ?

Aquí hay una muestra simplificada del nodo XML con el que estoy comenzando:

  

Me gustaría terminar con esta cadena:

 This is some text and a link in embedded HTML 

He intentado iterar sobre el nodo padre y concatenar el tostring() de los hijos, pero eso solo me dio los subnodos:

 # returns only subnodes (eg and a link) ''.join([et.tostring(sub, encoding="utf-8") for sub in node]) 

Puedo hackear una solución usando expresiones regulares, pero esperaba que hubiera algo menos intrépido que esto:

 re.sub("\s*?$", "", re.sub("^\s*?", "", et.tostring(node, encoding="utf-8"))) 

Qué tal si:

 from xml.etree import ElementTree as ET xml = 'start heresome texthereandhere as wellend here' root = ET.fromstring(xml) def content(tag): return tag.text + ''.join(ET.tostring(e) for e in tag) print content(root) print content(root.find('child2')) 

Resultando en:

 start heresome texthereandhere as wellend here here as well 

Lo siguiente me funcionó:

 from xml.etree import ElementTree as etree xml = 'start heresome texthereandhere as wellend here' dom = etree.XML(xml) (dom.text or '') + ''.join(map(etree.tostring, dom)) + (dom.tail or '') # 'start heresome texthereandhere as wellend here' 

dom.text or '' se usa para obtener el texto al inicio del elemento root . Si no hay texto dom.text es None .

Tenga en cuenta que el resultado no es un XML válido; un XML válido debe tener solo un elemento raíz.

Eche un vistazo a los documentos de ElementTree sobre contenido mixto .


Usando Python 2.6.5, Ubuntu 10.04

Esto se basa en las otras soluciones, pero las otras soluciones no funcionaron en mi caso (resultaron en excepciones) y esta funcionó:

 from xml.etree import Element, ElementTree def inner_xml(element: Element): return (element.text or '') + ''.join(ElementTree.tostring(e, 'unicode') for e in element) 

Úsalo de la misma manera que en la respuesta de Mark Tolonen .