Python3 Minidom Parse Data Inside Tag - PullRequest
0 голосов
/ 06 мая 2018

Я пытаюсь извлечь цифры из тегов этого 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 Как это:

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

Мне нужно значение 178,25 Как я могу изменить свой сценарий, чтобы сделать это Это мой первый проект парсера, поэтому я немного растерялся здесь. Любая помощь приветствуется

1 Ответ

0 голосов
/ 06 мая 2018

Тот факт, что вы не представили действительные данные XML (поскольку отсутствует корневой элемент), предлагает различные способы решения вашей проблемы. Но все эти методы очень похожи и основаны на использовании nodeValue. Ниже приведено решение.

Мы предполагаем, что у нас есть ваш действительный файл XML (и я знаю, что у вас есть один):

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

Оттуда мы будем искать элементы, имеющие данные в качестве имени тега:

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

datums - список всех объектов документа XML, имеющих имя тега datum ; и это на самом деле включает в себя тот, который вам не нужен: их родительский узел <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
...