Como substituir um elemento pelo texto em lxml?

É fácil remover completamente um determinado elemento de um documento XML com a implementação da API ElementTree do lxml, mas não vejo uma maneira fácil de substituir consistentemente um elemento por algum texto. Por exemplo, dada a seguinte entrada:

input = '''<everything>
<m>Some text before <r/></m>
<m><r/> and some text after.</m>
<m><r/></m>
<m>Text before <r/> and after</m>
<m><b/> Text after a sibling <r/> Text before a sibling<b/></m>
</everything>
'''

... você pode remover facilmente todos os<r> elemento com:

from lxml import etree
f = etree.fromstring(data)
for r in f.xpath('//r'):
    r.getparent().remove(r)
print etree.tostring(f, pretty_print=True)

No entanto, como você substituirá cada elemento pelo texto, para obter a saída:

<everything>
<m>Some text before DELETED</m>
<m>DELETED and some text after.</m>
<m>DELETED</m>
<m>Text before DELETED and after</m>
<m><b/>Text after a sibling DELETED Text before a sibling<b/></m>
</everything>

Parece-me isso porque a API ElementTree lida com texto através do.text e.tail atributos de cada elemento em vez de nós na árvore, isso significa que você precisa lidar com muitos casos diferentes, dependendo se o elemento possui elementos irmãos ou não, se o elemento existente possui um.tail attribute e assim por diante. Perdi alguma maneira fácil de fazer isso?

questionAnswers(3)

yourAnswerToTheQuestion