在lxml中,如何删除标记但保留所有内容?

Tho*_*hor 20 python xml lxml

问题是这样的:我有一个像这样的XML片段:

<fragment>text1 <a>inner1 </a>text2 <b>inner2</b> <c>t</c>ext3</fragment>
Run Code Online (Sandbox Code Playgroud)

对于结果,我想删除所有<a>- 和 - <c>标签,但保留它们的(文本)内容和子节点就像它们一样.此外,<b>-Element应保持不变.结果应该是这样的

<fragment>text1 inner<d>1</d> text2 <b>inner2</b> text3</fragment>
Run Code Online (Sandbox Code Playgroud)

暂时,我将恢复一个非常肮脏的技巧:我将etree.tostring片段,通过正则表达式删除有问题的标签,并用etree.fromstring结果替换原始片段(不是真正的代码,但应该是这样的):

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)
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用xslt实现这一点,我知道lxml可以使用xslt,但是必须有更多的lxml本机方法吗?

供参考:我已经尝试过使用lxml的element.replace,但由于我想在之前有一个元素节点的地方插入文本,我不认为我能做到这一点.

Kab*_*bie 34

试试这个:http://lxml.de/api/lxml.etree-module.html#strip_tags

>>> etree.strip_tags(fragment,'a','c')
>>> etree.tostring(fragment)
'<fragment>text1 inner1 text2 <b>inner2</b> text3</fragment>'
Run Code Online (Sandbox Code Playgroud)