Я пытаюсь проанализировать XML-файл с помощью cElementTree.iterparse. Однако я не могу понять, что происходит, потому что iterparse возвращает пустые элементы. У меня есть файл XML, который имеет следующий примерный макет:Почему cElementTree iterparse возвращает None элементов?
<DOCS>
<ID id="1">
<HEAD>title1</HEAD>
<DATE>21.01.2010</DATE>
<TEXT>
<P>some text</P>
<P>some text</P>
<P>some text</P>
</TEXT>
</ID>
<ID id="2">
<HEAD>title2</HEAD>
<DATE>21.01.2010</DATE>
<TEXT>
some text
</TEXT>
</ID>
</DATA>
Я пытаюсь извлечь текст из тега TEXT
или перебирать TEXT
тега детей (P
тегов) и извлечение текста из них.
Вот мой код:
import xml.etree.cElementTree as cet
docs = {}
id = ''
for event, elem in cet.iterparse(xml_data, events=('end',)):
if elem.tag == 'ID':
id = elem.attrib['id']
if elem.tag == 'TEXT':
if list(elem):
docs[id] = ''.join([p.text for p in elem])
else:
docs[id] = elem.text
#print(docs)
return docs
Когда я исполню мой код я получаю:
docs[id] = ''.join([p.text for p in elem])
TypeError: sequence item 14: expected str instance, NoneType found
Это означает, что один из p
в списке понимание [p.text for p in elem]
является None
. Хорошо, я использовал операторы печати, чтобы узнать, какой был предыдущий текст p
, чтобы узнать, есть ли что-то не так с XML-тегами. Ну, элемент p
, который не имеет никакого текста, должен иметь его, потому что он имеет текстовое тело в XML-файле. Может кто-нибудь объяснить, что происходит?