elementtree question

Mark T nospam at nospam.com
Fri Sep 21 23:19:59 EDT 2007


"Gabriel Genellina" <gagsl-py2 at yahoo.com.ar> wrote in message 
news:mailman.898.1190412966.2658.python-list at python.org...
> En Fri, 21 Sep 2007 11:49:53 -0300, Tim Arnold <tim.arnold at sas.com> 
> escribi�:
>
>> Hi, I'm using elementtree and elementtidy to work with some HTML files. 
>> For
>> some of these files I need to enclose the body content in a new div tag,
>> like this:
>> <body>
>>   <div class="remapped">
>>    original contents...
>>   </div>
>> </body>
>>
>> I figure there must be a way to do it by creating a 'div' SubElement to 
>> the
>> 'body' tag and somehow copying the rest of the tree under that 
>> SubElement,
>> but it's beyond my comprehension.
>
> import xml.etree.ElementTree as ET
> source = """<html><head><title>Test</title></head><body>
>  original contents... 2&3 <a href="hello/world">some text</a>
>  <p>Another paragraph</p>
> </body></html>"""
> tree = ET.XML(source)
> body = tree.find("body")
> newdiv = ET.Element('div', {'class':'remapped'})
> newdiv.append(body)
> bodyidx = tree.getchildren().index(body)
> tree[bodyidx]=newdiv
> ET.dump(tree)
>
> -- 
> Gabriel Genellina
>

The above wraps the body element, not the contents of the body element.  I'm 
no ElementTree expert, but this seems to work:

import xml.etree.ElementTree as ET
source = """<html><head><title>Test</title></head><body>
  original contents... 2&3 <a href="hello/world">some text</a>
  <p>Another paragraph</p>
</body></html>"""
tree = ET.XML(source)
body = tree.find("body")
newdiv = ET.Element('div', {'class':'remapped'})
for e in body.getchildren():
    newdiv.append(e)
newdiv.text = body.text
newdiv.tail = body.tail
body.clear()
body.append(newdiv)
ET.dump(tree)

Result:

<html><head><title>Test</title></head><body><div class="remapped">
  original contents... 2&3 <a href="hello/world">some text</a>
  <p>Another paragraph</p>
</div></body></html>

-Mark





More information about the Python-list mailing list