使用ElementTree时出现未定义实体错误

2 投票
1 回答
1655 浏览
提问于 2025-04-17 17:54

我有一组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()

撰写回答