首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用lxml.iterparse两次解析相同的内容

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

Stack Overflow用户
提问于 2014-02-18 17:07:09
回答 1查看 690关注 0票数 2

我不明白为什么这样做:

代码语言:javascript
复制
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

如果这样做行不通的话:

代码语言:javascript
复制
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

并给出了这个错误:

代码语言:javascript
复制
XMLSyntaxError: Extra content at the end of the document, line 1, column 1

我不能解析相同的内容两次吗?奇怪的是,当我只对循环进行注释,而不是整个迭代解析命令时,它就起作用了。

我错过什么东西了吗?

非常感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-18 17:12:31

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

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

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

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

代码语言:javascript
复制
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...
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21860590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档