Итерация по XML и выбор определенного c содержимого дерева элементов - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть XML, который выглядит следующим образом:

<openie>
  <triple confidence="1.000">
    <subject begin="0" end="1">
      <text>PAF</text>
      <lemma>paf</lemma>
    </subject>
    <relation begin="1" end="2">
      <text>gets</text>
      <lemma>get</lemma>
    </relation>
    <object begin="2" end="6">
      <text>name of web site</text>
      <lemma>name of web site</lemma>
    </object>
  </triple>
  <triple confidence="1.000">
    <subject begin="0" end="1">
      <text>PAF</text>
      <lemma>paf</lemma>
    </subject>
    <relation begin="1" end="2">
      <text>gets</text>
      <lemma>get</lemma>
    </relation>
    <object begin="2" end="3">
      <text>name</text>
      <lemma>name</lemma>
    </object>
  </triple>
</openie>

Элемент openie вложен здесь: root>document>sentences>sentence>openie

И в своей функции я пытаюсь напечатайте triples, каждый из которых содержит subject, relation, object элементов. К сожалению, я не могу заставить его работать, так как я не могу войти в эти три элемента и их элемент text. Какая часть неверна?

def get_openie():
    print('OpenIE parser start...')
    tree = ET.parse('./tmp/nlp_output.xml')
    root = tree.getroot()
    for triple in root.findall('./document/sentences/sentence/openie/triple'):
        t_subject = triple.find('subject/text').text
        t_relation = triple.find('relation/text').text
        t_object = triple.get('object/text').text
        print(t_subject,t_relation,t_object)

Вывод для двух тройок должен выглядеть следующим образом:

PAF gets name of web site

PAF gets name

Ответы [ 2 ]

0 голосов
/ 10 февраля 2020

BeautifulSoup - лучший инструмент для анализа файлов html и xml, поэтому вы можете использовать эти

from bs4 import BeautifulSoup as bs

with open('./tmp/nlp_output.xml', 'r') as xml:
    content = xml.read()

soup = bs(content, 'html.parser')
triples = soup.findAll('triple')
for triple in triples:
    t_subject = triple.find('subject').find('text').text
    t_relation = triple.find('relation').find('text').text
    t_object = triple.find('object').find('text').text
    print(t_subject,t_relation,t_object)
0 голосов
/ 10 февраля 2020

Чтобы получить t_object, вы используете triple.get() вместо triple.find(). Изменение, которое решает вашу проблему.

def get_openie():
    print('OpenIE parser start...')
    tree = ET.parse('./tmp/nlp_output.xml')
    root = tree.getroot()
    for triple in root.findall('./document/sentences/sentence/openie/triple'):
        t_subject = triple.find('subject/text').text
        t_relation = triple.find('relation/text').text
        t_object = triple.find('object/text').text
        print(t_subject,t_relation,t_object)
...