Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python从XML中提取元素_Python_Xml - Fatal编程技术网

使用Python从XML中提取元素

使用Python从XML中提取元素,python,xml,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&l

我试图从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>
我得到的结果是:

('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
你可以用

输出:

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>

2017-06-22 22:38:18
0
0
0
0
131997
1.
2039D
https://www.google.com.ar/
google.com.ar

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

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)

用于查找
i24
值的XPath表达式的分解:

  • *
    :查找任意名称的子元素
  • /item
    :然后从这些元素中找到名为
    item
    的子元素,其中
  • [@id=“imps24blank”]
    :…
    id
    属性值等于字符串“imps24blank”

我不太确定你在找什么。再次输出一个(精简的)xml文件,就是您在文章末尾发布的那个?或者将某些元素提取到python类型中,比如dict?您想对数据做什么?您的XML标记不匹配。我刚刚编辑了@ascripterYes,它确实是一个损坏的XML文件。如果这是您需要处理的,那么正则表达式方法可能是最好的。否则先修复XML。我修复XML,你知道如何提取我要找的内容吗@ascripter对于第二个,我需要内部值:
项{'id':'imps24blank'}“0”
还有,为什么我只能提取1个sitio的信息??因为我和以前一样有更多的信息,但是在xml@MartinBouhier如果您只需要项
id=“imps24blank”
您可以将if添加到for语句中如何将所有值混合为
自定义id None lang None fecha_alta 2017-06-22 22:38:18观察者无最终24小时fecha_baja None sitio_id 131997 estado 1 hex_sitio_id 2039; d urlhttps://www.google.com.ar/ nombre google.com.ar item{'id':'imps24ad'}0 item{'id':'clicks24'}0 item{'id':'imps24blank'}0 item{'id':'ctr24'}0
你说的“mix”是什么意思?我不明白如何创建一个变量来提取带有结果的
imps24blank
i24=s.find('*/item[@id=“imps24blank”])
不要给我看anything@MartinBouhier此答案中提供的eval.in演示显示了其他情况,它将打印
项0
。请创建演示您的问题的最小eval.in演示,否则我不知道如何帮助,因为相同的代码在我的演示中起作用。是的,我当时看到了,我得到了我想要的结果!谢谢你能帮我解答我的新问题吗?和这个很相似。
<?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>
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)