Python3 Minidom 解析标签内的数据
Python3 Minidom Parse Data Inside Tag
我正在尝试从这个 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)
但是输出 returns 是什么类型 = 所以它 returns 浮点数、数组和日期一遍又一遍,但我需要标签数据中的数字
像这样:
<datum type="float">178.25</datum>
我需要 178.25 值
我怎样才能改变我的脚本来做到这一点
这是我的第一个解析器项目,所以我在这里有点迷路。感谢任何帮助
您没有提供有效的 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.25是datum
元素的子节点。
<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
我正在尝试从这个 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)
但是输出 returns 是什么类型 = 所以它 returns 浮点数、数组和日期一遍又一遍,但我需要标签数据中的数字 像这样:
<datum type="float">178.25</datum>
我需要 178.25 值 我怎样才能改变我的脚本来做到这一点 这是我的第一个解析器项目,所以我在这里有点迷路。感谢任何帮助
您没有提供有效的 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.25是datum
元素的子节点。
<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