Извлекать текст XML, когда элементы между текстом - PullRequest
0 голосов
/ 31 января 2019

У меня есть этот XML-файл:

<do title='Example document' date='today'>
<db descr='First level'>
    <P>
        Some text here that
        <af d='reference 1'>continues</af>
        but then has some more stuff.
    </P>
</db>

, и мне нужно проанализировать его, чтобы извлечь его текст.Я использую xml.etree.ElementTree для этого ( см. Документацию ).

Это простой код, который я использую для анализа и изучения файла:

import xml.etree.ElementTree as ET
tree = ET.parse(file_path)
root = tree.getroot()

def explore_element(element):
    print(element.tag)
    print(element.attrib)
    print(element.text)
    for child in element:
        explore_element(child)

explore_element(root)

Все работаеткак и ожидалось, за исключением того, что элемент <P> не имеет полного текста.В частности, мне кажется, что мне не хватает «но потом есть еще кое-что» (текст в <P>, который идет после элемента <af>).

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

Есть ли способ получить весь текст?

вывод, который выдает мой код (в случае, если он помогает), таков:

do
{'title': 'Example document', 'date': 'today'}

db
{'descr': 'First level'}

P 
{}
        Some text here that

af
{'d': 'reference 1'}
continues

EDIT :

Принятый ответ заставил меня понять, что я не читал документацию каккак следует.Люди с подобными проблемами могут также найти полезными .tail .

1 Ответ

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

Использование BeautifulSoup:

list_test.xml:

<do title='Example document' date='today'>
<db descr='First level'>
    <P>
        Some text here that
        <af d='reference 1'>continues</af>
        but then has some more stuff.
    </P>
</db>

, а затем:

from bs4 import BeautifulSoup

with open('list_test.xml','r') as f:
    soup = BeautifulSoup(f.read(), "html.parser")
    for line in soup.find_all('p'):
         print(line.text)

ВЫХОД:

Some text here that
continues
but then has some more stuff.

РЕДАКТИРОВАТЬ:

Использование elementree:

import xml.etree.ElementTree as ET
xml = '<p> Some text here that <af d="reference 1">continues</af> but then has some more stuff.</p>'
tree = ET.fromstring(xml)
print(''.join(tree.itertext()))

ВЫХОД:

Some text here that continues but then has some more stuff.
...