Найти конкретный атрибут XML дочернего элемента с помощью Python? - PullRequest
0 голосов
/ 15 января 2019
<root>
  <article>
    <front>
      <body>
        <back>
          <sec id="sec7" sec-type="funding">
            <title>Funding</title>
            <p>This work was supported by the NIH</p>
          </sec>
        </back>

У меня есть XML-файл метаданных научного журнала, и я пытаюсь извлечь только информацию о финансировании для каждой статьи. Мне нужна информация, содержащаяся в теге p. В то время как «sec id» варьируется в зависимости от статьи, «sec-type» всегда означает «финансирование».

Я пытался сделать это в Python3, используя Element Tree.

import xml.etree.ElementTree as ET  

tree = ET.parse(journals.xml)
root = tree.getroot()
for title in root.iter("title"):
    ET.dump(title)

Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 15 января 2019

Вы можете использовать findall с выражением XPath для извлечения нужных значений. Я немного экстраполировал данные вашего примера, чтобы завершить документ и иметь два элемента p:

<root>
  <article>
    <front>
      <body>
        <back>
          <sec id="sec7" sec-type="funding">
            <title>Funding</title>
            <p>This work was supported by the NIH</p>
          </sec>
          <sec id="sec8" sec-type="funding">
            <title>Funding</title>
            <p>I'm a little teapot</p>
          </sec>
        </back>
      </body>
    </front>
  </article>
</root>

Следующее извлекает все текстовое содержимое узлов p в узле sec, где sectype="funding":

import xml.etree.ElementTree as ET

doc = ET.parse('journals.xml')
print([p.text for p in doc.findall('.//sec[@sec-type="funding"]/p')])

Результат:

['This work was supported by the NIH', "I'm a little teapot"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...