#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. пожалуйста, примите в качестве ответа 🙂