首页 > 解决方案 > Python3 Minidom 解析标签内的数据

问题描述

我试图从这个 XML 文件的标签中提取数字:

<start-date type="date">1980-12-12</start-date>
<end-date type="date">2018-05-04</end-date>
<data type="array">
  <datum type="array">
    <datum type="date">2018-05-04</datum>
    <datum type="float">178.25</datum>
    <datum type="float">184.25</datum>
    <datum type="float">178.17</datum>
    <datum type="float">183.83</datum>
    <datum type="float">56201317.0</datum>
    <datum type="float">0.0</datum>
    <datum type="float">1.0</datum>
    <datum type="float">178.25</datum>
    <datum type="float">184.25</datum>
    <datum type="float">178.17</datum>
    <datum type="float">183.83</datum>
    <datum type="float">56201317.0</datum>
  </datum>

使用此脚本:

#Test Parser

from xml.dom import minidom
xmldoc = minidom.parse('AAPL.xml')
itemlist = xmldoc.getElementsByTagName('datum')

print(len(itemlist))
print(itemlist[0].attributes['type'].value)
for s in itemlist:
    print(s.attributes['type'].value)

但是输出返回什么类型是 = 所以它一遍又一遍地返回浮点数、数组和日期,但我需要标签数据内的数字像这样:

<datum type="float">178.25</datum>

我需要 178.25 值 如何更改我的脚本来执行此操作 这是我的第一个解析器项目,所以我在这里有点迷路。任何帮助表示赞赏

标签: pythonpython-3.xparsingxml-parsingminidom

解决方案


您没有提供有效的 XML 数据(因为没有根元素)这一事实暗示了解决问题的不同方法。但是所有这些方法都非常相似,并且依赖于使用nodeValue. 下面是一个解决方案。

我们假设我们有您的有效 XML 文件(我知道您有一个):

>>> from xml.dom import minidom
>>> xmldoc = minidom.parse('AAPL.xml')

从那里,我们将寻找以datum作为标签名称的元素:

>>> datums = xmldoc.getElementsByTagName('datum')

datums是具有标签名称datum的所有 XML 文档对象的列表;这实际上包括您不需要的:他们的父节点<datum type="array">

因此,我们遍历这些datums(并排除父级)以显示它们的文本。

请注意,下面的文本178.25datum元素的子节点。

<datum type="float">178.25</datum>

这就是为什么我们需要循环如下:

>>> for datum in datums:
...     if datum.getAttribute('type') != 'array': #exclude the parent datum
...             print(datum.childNodes[0].nodeValue)

由于 datum 有一个子节点列表,它仅包含一个元素(文本元素),我们需要写入datum.childNodes[0]才能访问它。一旦我们将自己定位在那个文本元素中,我们就可以通过nodeValue前面提到的调用来读取它的内容。

这是输出:

>>> from xml.dom import minidom
>>> xmldoc = minidom.parse('AAPL.xml')
>>> datums = xmldoc.getElementsByTagName('datum')
>>> for datum in datums:
...     if datum.getAttribute('type') != 'array':
...             print(datum.childNodes[0].nodeValue)
... 
2018-05-04
178.25
184.25
178.17
183.83
56201317.0
0.0
1.0
178.25
184.25
178.17
183.83
56201317.0

推荐阅读