使用ElementTree时未定义的实体错误

时间:2013-03-04 19:53:50

标签: python xml-parsing elementtree

我有一组XML文件需要读取并格式化为单个CSV文件。为了从XML文件中读取,我使用了here提到的解决方案。

我的代码如下所示:

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上运行每个命令时(虽然没有for循环),它运行得很好。

如果你想知道XML结构,就像这样:

<Blog>
<date> some date </date>
<post> some blog post </post>
</Blog>

那么是什么导致了这个错误,为什么它不能从Python文件运行,而是从命令行运行?

更新:阅读this link后,我检查了files[0],发现'&amp;'符号出现几次。我认为这可能会导致问题。当我在命令行上运行相同的命令时,我使用随机文件进行读取。

1 个答案:

答案 0 :(得分:2)

正如我在更新中提到的,我怀疑可能会出现一些问题。 当我在命令行上运行相同的行时,错误没有出现的原因是因为我会随机选择一个没有任何此类字符的文件。

由于我主要需要<post></post>标记之间的内容,因此我创建了自己的解析器(如the link mentioned in the update中所述)。

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()