Как уже упоминалось, вы можете использовать метод remove()
для удаления (под) элементов из дерева:
for bad in tree.xpath("//fruit[@state=\'rotten\']"):
bad.getparent().remove(bad)
Но он удаляет элемент, включая его tail
, что является проблемой, еслиВы обрабатываете документы со смешанным содержимым, такие как HTML:
<div><fruit state="rotten">avocado</fruit> Hello!</div>
Становится
<div></div>
Что, я полагаю, вам не всегда нужно :) Я создал вспомогательную функцию для удаления только элементаи держите хвост:
def remove_element(el):
parent = el.getparent()
if el.tail.strip():
prev = el.getprevious()
if prev:
prev.tail = (prev.tail or '') + el.tail
else:
parent.text = (parent.text or '') + el.tail
parent.remove(el)
for bad in tree.xpath("//fruit[@state=\'rotten\']"):
remove_element(bad)
Таким образом, он будет держать текст хвоста:
<div> Hello!</div>