2

なぜこれが機能するのかわかりません:

content = urllib2.urlopen(url)

context = etree.iterparse(content, tag='{my_ns}my_first_tag')
context = iter(context)
#for event, elem in context:
#     pass

context = etree.iterparse(content, tag='{my_ns}my_second_tag')
for event, elem in context:
     pass

これが機能しない場所:

content = urllib2.urlopen(url)

context = etree.iterparse(content, tag='{my_ns}my_first_tag')
context = iter(context)
for event, elem in context:
     pass

context = etree.iterparse(content, tag='{my_ns}my_second_tag')
for event, elem in context:
     pass

そして私にこのエラーを与えます:

XMLSyntaxError: Extra content at the end of the document, line 1, column 1

同じコンテンツを 2 回解析することはできませんか? iterparse コマンド全体ではなく、ループをコメントするだけで機能するのは奇妙です。

何かを閉じるのに欠けていますか?

どうもありがとう

4

1 に答える 1

3

urllib2.urlopen照会している URL のコンテンツを読み取るために使用できるファイルのようなオブジェクトを提供します。

ここでは、反復できるがそれまでetree.iterparseはまったく触れないオブジェクトを返すと推測しています。contentその場合、最初のループはcontextの内容を反復処理するために使用されcontent、データを「消費」します。

2 番目の を作成するcontextと、同じ が渡されますがcontent、これはそれまでに「空」になっています。

編集:再解析する方法を尋ねると... 1つは、データ全体を読み取り、それをファイルのようなオブジェクトとしてiterparse使用して各呼び出しに個別に渡すことです。StringIO例えば。

from StringIO import StringIO

# ...

data = content.read()
context = etree.iterparse(StringIO(data), tag='{my_ns}my_first_tag')
# processing...
context = etree.iterparse(StringIO(data), tag='{my_ns}my_second_tag')
# processing...
于 2014-02-18T17:12:31.583 に答える