Python 删除元素,但不删除其后面的文本

Python 删除元素,但不删除其后面的文本,python,elementtree,Python,Elementtree,我有一个类似以下内容的XML文件: <root> <a>Some <b>bad</b> text <i>that</i> I <u>do <i>not</i></u> want to keep.</a> </root> (我在中使用了配方来构建父映射)。当然,问题是使用remove(item)我也会删除元素后面的文本,结果是: Some that I

我有一个类似以下内容的
XML
文件:

<root>
<a>Some <b>bad</b> text <i>that</i> I <u>do <i>not</i></u> want to keep.</a>
</root>
(我在中使用了配方来构建
父映射
)。当然,问题是使用
remove(item)
我也会删除元素后面的文本,结果是:

Some that I
而我想要的是:

Some  text that I  want to keep.

有什么解决方法吗?

如果您最终无法使用更好的方法,您可以使用
clear()
而不是
remove()
保留元素的尾部:

import xml.etree.ElementTree as ET


data = """<root>
<a>Some <b>bad</b> text <i>that</i> I <u>do <i>not</i></u> want to keep.</a>
</root>"""

tree = ET.fromstring(data)
a = tree.find('a')
for element in a:
    if element.tag in ('b', 'u'):
        tail = element.tail
        element.clear()
        element.tail = tail

print ET.tostring(tree)
另外,这里有一个使用
xml.dom.minodom
的解决方案:

import xml.dom.minidom

data = """<root>
<a>Some <b>bad</b> text <i>that</i> I <u>do <i>not</i></u> want to keep.</a>
</root>"""

dom = xml.dom.minidom.parseString(data)
a = dom.getElementsByTagName('a')[0]
for child in a.childNodes:
    if getattr(child, 'tagName', '') in ('u', 'b'):
        a.removeChild(child)

print dom.toxml()
import xml.dom.minidom
data=”“”
一些我不想保留的坏文本。
"""
dom=xml.dom.minidom.parseString(数据)
a=dom.getElementsByTagName('a')[0]
对于a.childNodes中的子节点:
如果在('u','b')中有getattr(子,'tagName',''):
a、 removeChild(儿童)
打印dom.toxml()
印刷品:

<?xml version="1.0" ?><root>
<a>Some  text <i>that</i> I  want to keep.</a>
</root>

一些我想保留的文本。

谢谢。我尝试删除元素中的所有文本,但没有考虑保存和恢复尾部。我不介意更改为不同的解析器,只要它包含在标准python发行版中。
import xml.dom.minidom

data = """<root>
<a>Some <b>bad</b> text <i>that</i> I <u>do <i>not</i></u> want to keep.</a>
</root>"""

dom = xml.dom.minidom.parseString(data)
a = dom.getElementsByTagName('a')[0]
for child in a.childNodes:
    if getattr(child, 'tagName', '') in ('u', 'b'):
        a.removeChild(child)

print dom.toxml()
<?xml version="1.0" ?><root>
<a>Some  text <i>that</i> I  want to keep.</a>
</root>