Извлечение текста из xml do c с Python ElementTree - PullRequest
1 голос
/ 21 апреля 2020

У меня есть xml do c в следующем формате

<samples>
   <sample count="10" intentref="none">
      Remember to
      <annotation conceptref="cf1">
         <annotation conceptref="cf2">record</annotation>
      </annotation>
      the
      <annotation conceptref="cf3">movie</annotation>
      <annotation conceptref="cf4">Taxi driver</annotation>
   </sample>
</samples>

, и я хотел бы извлечь весь текст, либо тот, который не заключен в тег аннотации, либо тот, что в аннотации тег, чтобы восстановить исходную фразу. Итак, мой вывод будет -> Не забудьте записать mov ie Таксист

Проблема, по-видимому, в том, что нет способа получить токен 'Здесь фрагмент моего кода

import xml.etree.ElementTree as ET 
    samples = ET.fromstring("""
     <samples>
     <sample count="10" intentref="none">Remember to<annotation conceptref="cf1"><annotation conceptref="cf2">record</annotation></annotation>the<annotation conceptref="cf3">movie</annotation><annotation conceptref="cf4">Taxi driver</annotation></sample>
     </samples>
    """)

    for sample in samples.iter("sample"):
        print ('***'+sample.text+'***'+sample.tail)
        for annotation in sample.iter('annotation'):
            print(annotation.text)
            for nested_annotation in annotation.getchildren():
                  print(nested_annotation.text)

Я думал, что вложенная аннотация могла бы помочь ... но нет, вот результат

***Remember to'***

None
record
record
movie
Taxi driver

Ответы [ 3 ]

0 голосов
/ 21 апреля 2020

Я думаю, вы ищете itertext метод:

# Iterate over all the sample block
for sample in tree.xpath('//sample'):
    print(''.join(sample.itertext()))

Полный код:

# Load module
import lxml.etree as etree

# Load data
parser = etree.XMLParser(remove_blank_text=True)
tree = etree.parse('data.xml', parser)

# Iterate over all the sample block
for sample in tree.xpath('//sample'):
    print(''.join(sample.itertext()))

# programmer l'
# enregistreur
# des
# oeuvres
# La Chevauchée de Virginia
0 голосов
/ 22 апреля 2020

Другое решение.

from simplified_scrapy import SimplifiedDoc,req,utils
html = '''
<samples>
   <sample count="10" intentref="none">
      Remember to
      <annotation conceptref="cf1">
         <annotation conceptref="cf2">record</annotation>
      </annotation>
      the
      <annotation conceptref="cf3">movie</annotation>
      <annotation conceptref="cf4">Taxi driver</annotation>
   </sample>
</samples>
'''
doc = SimplifiedDoc(html)
print(doc.selects('sample').text) # Extract all the text

# Another examples
for sample in doc.selects('sample'):
  print (sample.count, sample.annotation.text)

Результат:

['Remember to record the movie Taxi driver']
10 record

Вот еще несколько примеров. https://github.com/yiyedata/simplified-scrapy-demo/tree/master/doc_examples

0 голосов
/ 21 апреля 2020

Вы были довольно близко. Я бы сделал это так:

import xml.etree.ElementTree as ET


samples = ET.fromstring("""<samples>
   <sample count="10" intentref="none">
      Remember to
      <annotation conceptref="cf1">
         <annotation conceptref="cf2">record</annotation>
      </annotation>
      the
      <annotation conceptref="cf3">movie</annotation>
      <annotation conceptref="cf4">Taxi driver</annotation>
   </sample>
</samples>
""")


for page in samples.findall('.//'):
    text = page.text if page.text else ''
    tail = page.tail if page.tail else ''
    print(text + tail)

Что даст вам:


      Remember to




      the

record

movie

Taxi driver

Вы можете заметить, что порядок слов не тот, который вы хотите, а вы возможно, это можно исправить, запомнив элемент с хвостом и текстом и вставив хвост после этой итерации. Не уверен, что это правильный путь.

...