我不明白为什么这可行:
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命令时,它正在工作。
我想关闭什么吗?
非常感谢
最佳答案
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...