2013-08-26 66 views
0

我的python代码执行第一个'for'循环,但不是第二个循环。如果我注释掉第一个for循环,则第二个执行正确。Python执行一个'for'循环但不是第二个

代码:

import urllib.request 
from bs4 import BeautifulSoup 
from bs4 import NavigableString 

site = urllib.request.urlopen('http://www.reddit.com/') 
html = site.read() 

soup = BeautifulSoup(html) 
tags = soup.body.children 

for item in tags:   
    print (item.name) 
    print (item.attrs) 

for item in tags: 
    if ('role' in item.attrs and item.attrs['role'] == 'banner'): 
     print (item) 
    else: pass 

什么想法?我的IDLE gui今晚的表现很奇怪(shift + indent是缩进而不是缩进),所以如果这适用于其他人,那么它可能就是我的盒子。

感谢社区!

回答

2

我从来没有用过BeautifulSoup,但听起来很像tags是一个迭代器,而不是一个列表或类似的东西。这意味着,iter(tags) is tags,它的状态被next()所改变。因此,迭代它将无可挽回地消耗它。我也打赌body.children是一个属性,它在每次访问时创建一个新的迭代器,所以如果你先将它变成一个列表,或者在第一次循环后重复tags = soup.body.children,那么你可以运行这两个循环。

+0

最简单的解决方案,重新定义标签,工作。最有效的,从标签创建一个列表,也可以。谢谢 –

1

tags是一个可迭代的,但不是一个序列;第一个for循环耗尽了迭代器,第二个元素不会留下任何元素。将它传递给listtuple构造函数以从中创建一个序列,然后遍历它。

相关问题