2

読み取り、単一のCSVファイルにフォーマットする必要がある一連のXMLファイルがあります。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>主にとタグの間のコンテンツが必要だったので</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 に答える