Python执行一个'for'循环但不执行第二个循环

时间:2013-08-26 01:29:11

标签: python http for-loop beautifulsoup

我的python代码执行第一个' for'循环,但不是第二个。如果我注释掉第一个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是缩进而不是unnting)所以如果这对其他人都适用,那么它可能只是我的盒子。

感谢社区!

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

tags是一个可迭代的,但不是一个序列;第一个for循环耗尽了迭代,第二个没有元素。将其传递给listtuple构造函数以从中创建序列,然后迭代它。