【问题标题】:Python3 Minidom Parse Data Inside TagPython3 Minidom 解析标签内的数据
【发布时间】:2018-10-16 01:54:39
【问题描述】:

我正在尝试从这个 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)

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

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

我需要 178.25 的值 我怎样才能改变我的脚本来做到这一点 这是我的第一个解析器项目,所以我有点迷路了。任何帮助表示赞赏

【问题讨论】:

    标签: python python-3.x parsing xml-parsing minidom


    【解决方案1】:

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

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

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

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

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

    datums 是所有具有标签名称 datum 的 XML 文档对象的列表;这实际上包括你不需要的那个:他们的父节点&lt;datum type="array"&gt;。

    因此,我们遍历这些 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-31
      • 2012-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-31
      • 1970-01-01
      相关资源
      最近更新 更多