0

私の python コードは最初の「for」ループを実行しますが、2 番目のループは実行しません。最初の for ループをコメントアウトすると、2 番目の 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ループは iterable を使い果たし、2 番目のループには要素が残りません。listそれをorコンストラクターに渡してtupleシーケンスを作成し、それを反復処理します。

于 2013-08-26T01:34:04.127 に答える