Reputation: 361
I'm trying to extract some specifics elements from a XML. I download the data from an API and save in a variable as sitios2
.
xml code:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<lista><sitio sitio_id="131997">
<custom_id/> <lang></lang>
<fecha_alta>2017-06-22 22:38:18</fecha_alta>
<observaciones/> <ultimas24hrs> <item id='imps24ad'>0</item>
<item id='clicks24'>0</item>
<item id='imps24blank'>0</item>
<item id='ctr24'>0</item>
</ultimas24hrs>
<fecha_baja/> <sitio_id>131997</sitio_id>
<estado>1</estado>
<hex_sitio_id>2039D
</hex_sitio_id>
<url>https://www.google.com.ar/</url>
<nombre>google.com.ar</nombre>
</sitio>
My code:
import xml.etree.ElementTree as ET
root = ET.fromstring(sitios2)
for child in root:
print(child.tag, child.attrib)
for item in root.iter('item'):
print(item.attrib)
output I have is:
('sitio', {'sitio_id': '131997'})
{'id': 'imps24ad'}
{'id': 'clicks24'}
what i'm looking for is a txt file with all data but only with the information I need:
sitio_id="131997"
fecha_alta 2017-06-22 22:38:18
imps24blank 0
estado 1
url https://www.google.com.ar/
nombre google.com.ar
Upvotes: 0
Views: 102
Reputation: 89325
Just iterate through sitio
elements, and use XPath to find all information needed within current sitio
in every iteration :
for s in root.findall('sitio'):
id = s.find('sitio_id')
fa = s.find('fecha_alta')
i24 = s.find('*/item[@id="imps24blank"]')
estado = s.find('estado')
url = s.find('url')
nombre = s.find('nombre')
print(id.tag, id.text)
print(fa.tag, fa.text)
print(i24.tag, i24.text)
print(estado.tag, estado.text)
print(url.tag, url.text)
print(nombre.tag, nombre.text)
Break down of the XPath expression used to find i24
value :
*
: find child element of any name/item
: then from such elements, find child elements named item
where...[@id="imps24blank"]
: ...id
attribute value equals string "imps24blank"Upvotes: 0
Reputation: 4190
You can use xpath
for child in root.find("./sitio"):
print(child.tag, child.text)
for item in root.findall('./sitio/ultimas24hrs/item'):
print(item.tag, item.attrib, item.text)
output:
custom_id None
lang None
fecha_alta 2017-06-22 22:38:18
observaciones None
ultimas24hrs
fecha_baja None
sitio_id 131997
estado 1
hex_sitio_id 2039D
url https://www.google.com.ar/
nombre google.com.ar
item {'id': 'imps24ad'} 0
item {'id': 'clicks24'} 0
item {'id': 'imps24blank'} 0
item {'id': 'ctr24'} 0
NOTE: Your provided xml is not valid, so I assumed that your xml is:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<lista>
<sitio sitio_id="131997">
<custom_id/>
<lang/>
<fecha_alta>2017-06-22 22:38:18</fecha_alta>
<observaciones/>
<ultimas24hrs>
<item id="imps24ad">0</item>
<item id="clicks24">0</item>
<item id="imps24blank">0</item>
<item id="ctr24">0</item>
</ultimas24hrs>
<fecha_baja/>
<sitio_id>131997</sitio_id>
<estado>1</estado>
<hex_sitio_id>2039D</hex_sitio_id>
<url>https://www.google.com.ar/</url>
<nombre>google.com.ar</nombre>
</sitio>
</lista>
Upvotes: 1