Метод 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)
Используйте метод 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.
Вы ищете функцию 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>
Я встретил одну ситуацию:
<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), который вы передали, даже если он совпадает. Он будет относиться только к своим потомкам. Если вы хотите включить корневой элемент, проверьте его имя тега непосредственно перед тем, как вызвать эту функцию.
Пример использования ::
blockquote>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 )