使用lxml添加属性、删除元素等

13 投票
2 回答
25995 浏览
提问于 2025-04-16 01:11

我用下面的代码解析了XML:

from lxml import etree

tree = etree.parse('test.xml', etree.XMLParser())

现在我想处理解析出来的XML。可是我在删除带有命名空间的元素或者一般的元素时遇到了麻烦,比如:

<rdf:description><dc:title>Example</dc:title></rdf:description>

我想删除整个元素以及标签里面的所有内容。我还想给现有的元素添加属性。需要用到的方法在Element类里面,但我不知道怎么把它和这里的ElementTree对象结合起来使用。任何建议都会很有帮助,谢谢!

2 个回答

1

这个 remove 方法应该能满足你的需求:

>>> from lxml import etree
>>> from StringIO import StringIO

>>> s = '<Root><Description><Title>foo</Title></Description></Root>'
>>> tree = etree.parse(StringIO(s))

>>> print(etree.tostring(tree.getroot()))
<Root><Description><Title>foo</Title></Description></Root>

>>> title = tree.find('//Title')
>>> title.getparent().remove(title)
>>> etree.tostring(tree.getroot())
'<Root><Description/></Root>'

>>> print(etree.tostring(tree.getroot()))
<Root><Description/></Root>
25

你可以通过这个调用来获取根元素:root=tree.getroot()

有了这个根元素,你可以使用findall()来找到符合你条件的元素,并将它们移除:

deleteThese = root.findall("title")
for element in deleteThese: root.remove(element)

最后,你可以用这个命令查看你新的树结构是怎样的:etree.tostring(root, pretty_print=True)

关于findfindall的工作原理,这里有一些信息: http://infohost.nmt.edu/tcc/help/pubs/pylxml/class-ElementTree.html#ElementTree-find

如果你想给一个元素添加属性,可以试试这样的写法:

root.attrib['myNewAttribute']='hello world'

撰写回答