繁体   English   中英

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

[英]Parsing same content twice with 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命令时,它正在工作。

我想关闭什么吗?

非常感谢

urllib2.urlopen为您提供了一个类似文件的对象,您可以使用该对象读取查询的URL的内容。

我在这里猜测etree.iterparse返回的对象可以被迭代,但是直到那时才完全不接触content 在这种情况下,第一个循环使用context来迭代内容的content ,从而“消费”数据。

创建第二个context ,您传递的是相同的content ,那时该content为“空”。

编辑:当您要求重新解析的方法时...一种方法是读取整个数据,然后使用StringIO作为类似于文件的对象将其分别传递给每个iterparse调用。 例如。

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...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM