使用ElementTree时出现未定义实体错误
我有一组XML文件,想把它们读出来并整理成一个CSV文件。为了读取这些XML文件,我用了一个在这里提到的解决方案。
我的代码大概是这样的:
from os import listdir
import xml.etree.cElementTree as et
files = listdir(".../blogs/")
for i in range(len(files)):
# fname = ".../blogs/" + files[i]
f = open(".../blogs/" + files[i], 'r')
contents = f.read()
tree=et.fromstring(contents)
for el in tree.findall('post'):
post = el.text
f.close()
运行时出现了一个错误,提示是cElementTree.ParseError: undefined entity:
,出现在这一行tree=et.fromstring(contents)
。奇怪的是,当我在命令行的Python里逐条运行这些命令(没有用循环)时,一切都正常。
如果你想知道XML的结构,它是这样的:
<Blog>
<date> some date </date>
<post> some blog post </post>
</Blog>
那么,是什么导致了这个错误呢?为什么在Python文件里运行不行,而在命令行里却可以呢?
更新:在看了这个链接后,我检查了files[0]
,发现里面有几次出现了'&'这个符号。我觉得这可能是问题的原因。当我在命令行运行同样的命令时,用的是一个随机文件。
1 个回答
2
正如我在更新中提到的,我怀疑有一些符号可能会导致问题。之所以在命令行运行相同的代码时没有出现错误,是因为我随机选择了一个没有这些特殊字符的文件。
因为我主要需要的是<post>
和</post>
标签之间的内容,所以我自己写了一个解析器(就像在更新中提到的链接里建议的那样)。
from os import listdir
files = listdir(".../blogs/")
for i in range(len(files)):
f = open(".../blogs/" + files[i], 'r')
contents = f.read()
seek1 = contents.find('<post>')
seek2 = contents.find('</post>', seek1+1)
while(seek1!=-1):
post = contents[seek1+5:seek2+6]
seek1 = contents.find('<post>', seek1+1)
seek2 = contents.find('</post>', seek1+1)
f.close()