我正在尝试使用cElementTree.iterparse解析xml文件。 但是,我无法理解发生了什么,因为iterparse返回空元素。 我有一个xml文件具有以下近似布局:
<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
。好的,我使用print语句知道哪个是以前的p
文本,看看xml文件标签是否有问题。好吧,实际上没有任何文本的p
元素应该拥有它,因为它在xml文件中有一个文本正文。有人可以解释发生了什么吗?
答案 0 :(得分:0)
忘记if event == 'end':
检查的愚蠢错误。
所以,发生的事情是只有当event == 'end'
我们有一个完全填充的elem
对象时。