how to remove attribute of a etree Element?
Asked Answered
R

3

53

I've Element of etree having some attributes - how can we delete the attribute of perticular etree Element.

Risner answered 27/4, 2010 at 10:31 Comment(0)
C
52

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.

Crifasi answered 27/4, 2010 at 10:34 Comment(4)
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_attributesLowly
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
R
14

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>'
Reduplicative answered 12/1, 2017 at 10:58 Comment(0)
A
10

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
Archlute answered 7/6, 2011 at 20:22 Comment(1)
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.