Полностью удалить заданный элемент из XML-документа с помощью lxml-реализации ElementTree API несложно, но я не вижу простого способа последовательно заменить элемент некоторым текстом. Например, учитывая следующий ввод:
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>
'''
... вы можете легко удалить каждый элемент <r>
с помощью:
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)
Однако как бы вы заменили каждый элемент текстом, чтобы получить результат:
<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>
Мне кажется, что, поскольку API ElementTree работает с текстом через атрибуты .text
и .tail
каждого элемента, а не через узлы в дереве, это означает, что вам приходится иметь дело с множеством разных случаев в зависимости от того, есть ли у элемента родственные элементы или нет. , имел ли существующий элемент атрибут .tail
и т. д. Я пропустил какой-то простой способ сделать это?
strip_elements
илиwith_tail
optino 26.03.2011soup = BeautifulSoup(text, "lxml") / soup.find_all('r').replace_with('DELETED')
22.08.2018