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

我不能两次解析相同的内容吗?奇怪的是,当我只评论循环而不是整个 iterparse 命令时它正在工作。

我想关闭一些东西吗?

非常感谢

4

1 回答 1

3

urllib2.urlopen给你一个类似文件的对象,你可以用它来读取你正在查询的 URL 的内容。

我猜这里会etree.iterparse返回一个可以迭代但content在此之前根本不会触及的对象。在这种情况下,第一个循环context用于迭代 的内容content,“消费”数据。

当你创建第二个context时,你传递的是相同的content,到那时它是“空的”。

编辑:当您要求重新解析的方法时...一种是读出整个数据,然后将其作为类文件对象分别传递给每个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 回答