Python XML удаляет узлы по условию [duplicate]

Метод rename может принимать функцию, например:

In [11]: df.columns
Out[11]: Index([u'$a', u'$b', u'$c', u'$d', u'$e'], dtype=object)

In [12]: df.rename(columns=lambda x: x[1:], inplace=True)

In [13]: df.columns
Out[13]: Index([u'a', u'b', u'c', u'd', u'e'], dtype=object)

60
задан ewok 12 May 2013 в 03:57
поделиться

3 ответа

Используйте метод remove для xmlElement:

tree=et.fromstring(xml)

for bad in tree.xpath("//fruit[@state=\'rotten\']"):
  bad.getparent().remove(bad)     # here I grab the parent of the element to call the remove directly on it

print et.tostring(tree, pretty_print=True, xml_declaration=True)

Если мне пришлось сравнивать с версией @Acorn, моя работа будет работать, даже если элементы для удаления не находятся непосредственно под корневым узлом вашего xml.

110
ответ дан Sheena 24 August 2018 в 00:29
поделиться

Вы ищете функцию remove. Вызвать метод удаления дерева и передать ему подэлемент для удаления.

import lxml.etree as et

xml="""
<groceries>
  <fruit state="rotten">apple</fruit>
  <fruit state="fresh">pear</fruit>
  <punnet>
    <fruit state="rotten">strawberry</fruit>
    <fruit state="fresh">blueberry</fruit>
  </punnet>
  <fruit state="fresh">starfruit</fruit>
  <fruit state="rotten">mango</fruit>
  <fruit state="fresh">peach</fruit>
</groceries>
"""

tree=et.fromstring(xml)

for bad in tree.xpath("//fruit[@state='rotten']"):
    bad.getparent().remove(bad)

print et.tostring(tree, pretty_print=True)

Результат:

<groceries>
  <fruit state="fresh">pear</fruit>
  <fruit state="fresh">starfruit</fruit>
  <fruit state="fresh">peach</fruit>
</groceries>
23
ответ дан Acorn 24 August 2018 в 00:29
поделиться

Я встретил одну ситуацию:

<div>
    <script>
        some code
    </script>
    text here
</div>

div.remove(script) удалит часть text here, которую я не имел в виду.

после ответа здесь , я обнаружил, что etree.strip_elements - лучшее решение для меня, которое вы можете контролировать, удаляете ли вы текст с параметром with_tail=(bool).

Но все же я не знаете, может ли это использовать фильтр xpath для тега. Просто укажите это для информирования.

Вот документ:

strip_elements (tree_or_element, * tag_names, with_tail = True)

Удалить все элементы с помощью предоставленные имена тегов из дерева или поддерева. Это приведет к удалению элементов и всего их поддерева, включая все их атрибуты, текстовое содержимое и потомки. Он также удалит хвостовой текст элемента, если вы явно не установите параметр аргумента ключевого слова with_tail в значение False.

Имена меток могут содержать подстановочные знаки, как в _Element.iter.

Примечание. что это не приведет к удалению элемента (или корневого элемента ElementTree), который вы передали, даже если он совпадает. Он будет относиться только к своим потомкам. Если вы хотите включить корневой элемент, проверьте его имя тега непосредственно перед тем, как вызвать эту функцию.

Пример использования ::

   strip_elements(some_element,
       'simpletagname',             # non-namespaced tag
       '{http://some/ns}tagname',   # namespaced tag
       '{http://some/other/ns}*'    # any tag from a namespace
       lxml.etree.Comment           # comments
       )
7
ответ дан zephor 24 August 2018 в 00:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: