2

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

如果你想知道 XML 结构,它是这样的:

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

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

更新:阅读此链接后,我检查files[0]并发现“&”符号出现了几次。我认为这可能是导致问题的原因。当我在命令行上运行相同的命令时,我使用了一个随机文件来读取。

4

1 回答 1

2

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

由于我主要需要<post>and</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()
于 2013-03-04T20:18:14.697 回答