使用lxml.iterparse解析相同的内容两次

时间:2014-02-18 17:07:09

标签: python lxml iterparse

我不知道为什么会这样:

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命令时,它正在工作。

我想要关闭一些东西吗?

非常感谢

1 个答案:

答案 0 :(得分: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...