使用Python从XML中提取元素

时间:2018-01-26 13:21:49

标签: python xml

我正在尝试从XML中提取一些特定元素。我从API下载数据并将变量保存为sitios2

xml代码:

<?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>

我的代码:

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)

输出我是:

('sitio', {'sitio_id': '131997'})

{'id': 'imps24ad'}
{'id': 'clicks24'}

我正在寻找的是一个包含所有数据的txt文件,但只包含我需要的信息:

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

2 个答案:

答案 0 :(得分:1)

您可以使用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)

输出:

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

注意: 您提供的xml无效,因此我假设您的xml是:

<?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>

答案 1 :(得分:0)

只需遍历MyCls元素,并使用XPath在每次迭代中查找当前sitio内所需的所有信息:

sitio

<强> eval.in demo

分解用于查找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) 值的XPath表达式:

  • i24:找到任何名称的子元素
  • *:然后从这些元素中找到名为/item的子元素,其中......
  • item:... [@id="imps24blank"]属性值等于字符串&#34; imps24blank&#34;