I've Element of etree having some attributes - how can we delete the attribute of perticular etree Element.
how to remove attribute of a etree Element?
Asked Answered
The .attrib
member of the element object contains the dict of attributes - you can use .pop("key")
or del
like you would on any other dict to remove a key-val pair.
I found 1 another solution etree.strip_attrbutes(element,'attribute_name')) –
Risner
While
pop
works, del
does not: AttributeError: attribute 'attrib' of 'lxml.etree._Element' objects is not writable
- see also the Element documentation which speaks of a dict like interface, but also does not mention pop
. –
Toledo @Risner etree.strip_attrbutes is not safe because it will Delete all attributes with the provided attribute names from an Element (or ElementTree) and its descendants. lxml.de/api/lxml.etree-module.html#strip_attributes –
Lowly
The documentation says
Note that while the attrib value is always a real mutable Python dictionary, an ElementTree implementation may choose to use another internal representation, and create the dictionary only if someone asks for it. To take advantage of such implementations, use the dictionary methods below whenever possible.
(see docs.python.org/3/library/…). Isn't this solution breaking that recommendation? –
Insociable You do not need to try/except
while you are popping a key which is unavailable. Here is how you can do this.
Code
import xml.etree.ElementTree as ET
tree = ET.parse(file_path)
root = tree.getroot()
print(root.attrib) # {'xyz': '123'}
root.attrib.pop("xyz", None) # None is to not raise an exception if xyz does not exist
print(root.attrib) # {}
ET.tostring(root)
'<urlset> <url> <changefreq>daily</changefreq> <loc>http://www.example.com</loc></url></urlset>'
Example :
>>> from lxml import etree
>>> from lxml.builder import E
>>> otree = E.div()
>>> otree.set("id","123")
>>> otree.set("data","321")
>>> etree.tostring(otree)
'<div id="123" data="321"/>'
>>> del otree.attrib["data"]
>>> etree.tostring(otree)
'<div id="123"/>'
Take care sometimes you dont have the attribute:
It is always suggested that we handle exceptions.
try:
del myElement.attrib["myAttr"]
except KeyError:
pass
It is somewhat better to only catch the expected exceptions in case something else went wrong. In this case: except KeyError: –
Presuppose
© 2022 - 2024 — McMap. All rights reserved.