0

我的 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 是缩进而不是取消缩进),所以如果这对其他所有人都有效,它可能只是我的盒子。

感谢社区!

4

2 回答 2

2

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

于 2013-08-26T01:34:02.943 回答
1

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

于 2013-08-26T01:34:04.127 回答