我不明白为什么这样做:
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我不能解析相同的内容两次吗?奇怪的是,当我只对循环进行注释,而不是整个迭代解析命令时,它就起作用了。
我错过什么东西了吗?
非常感谢
发布于 2014-02-18 17:12:31
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...https://stackoverflow.com/questions/21860590
复制相似问题