我的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)所以如果这对其他人都适用,那么它可能只是我的盒子。
感谢社区!
答案 0 :(得分:2)
我从未使用过BeautifulSoup,但听起来很像tags
是一个迭代器,而不是列表或类似的东西。这意味着iter(tags) is tags
,它的状态由next()
改变。因此,迭代它会不可挽回地消耗它。我也打赌body.children
是一个在每次访问时创建一个新迭代器的属性,因此如果先将其转换为列表,则可以运行这两个循环,或者在第一个循环后重复tags = soup.body.children
。
答案 1 :(得分:1)
tags
是一个可迭代的,但不是一个序列;第一个for
循环耗尽了迭代,第二个没有元素。将其传递给list
或tuple
构造函数以从中创建序列,然后迭代它。