Python etree.Извлеченный XML-текст ElementTree усекается, когда текст содержит теги HTML

#python #xml #xml-parsing #elementtree #xml.etree

Вопрос:

Я очищаю XML-документы pubmed, используя xml.etree python.ElementTree. Наличие элементов форматирования html, встроенных в текст, приводит к возвращению фрагментированного текста для данного элемента xml. Следующий XML-элемент возвращает текст только до тега, выделенного курсивом.

 <AbstractText>Snow mold is a severe plant disease caused by psychrophilic or psychrotolerant fungi, of which <i>Microdochium</i> species are the most harmful.</AbstractText>
 

Вот пример кода, который работает, но не может вернуть полную запись, содержащую html.

 import xml.etree.ElementTree as ET
xmldata = 'directory/to/data.xml'
tree = ET.parse(xmldata)
root = tree.getroot()

abstracts = {}

for i in range(len(root)):
    for child in root[i].iter():
        if child.tag == 'ArticleTitle':
            title = child.text
            titles[i] = title
 

Я также попытался сделать что-то подобное с child.xpath(‘//AbstractText/text()’), используя lxml.etree. Это возвращает весь текст в документе в виде элементов списка, но без четкого способа объединения элементов в исходную аннотацию (т. Е. 3 аннотации потенциально могут возвращать 3 элемента списка.

Ответ №1:

Ответ itertext() -> Для сбора внутреннего текста элемента.

Таким образом, код будет выглядеть:

 import xml.etree.ElementTree as ET
from io import StringIO

raw_data="""
<AbstractText>Snow mold is a severe plant disease caused by psychrophilic or psychrotolerant fungi, of which <i>Microdochium</i> species are the most harmful.</AbstractText>
"""
tree = ET.parse(StringIO(raw_data))
root = tree.getroot()
# in the element there is child element, that is reason text was coming till <i>
for e in root.findall("."):
    print(e.text,type(e))
 

Snow mold is a severe plant disease caused by psychrophilic or psychrotolerant fungi, of which <class 'xml.etree.ElementTree.Element'>

с помощью itertext()

 "".join(root.find(".").itertext()) # "".join(element.itertext())
 

'Snow mold is a severe plant disease caused by psychrophilic or psychrotolerant fungi, of which Microdochium species are the most harmful.'

Комментарии:

1. Itertext() работает! Спасибо за ответ.

2. пожалуйста, примите в качестве ответа 🙂