これはエラーではありません。つまり、Browser.links()
はリストではなくジェネレータオブジェクトを返します。 iterator
は、あなたがそうで
for link in links:
print link
とのようなものを行うことができますことを意味し、「リストのように」動作するオブジェクトです。しかし、あなたはそれが定義する順序どおりに物にアクセスすることができます。 link[5]
を必ずしも実行することはできません。そして、イテレータを使いこなせば、それは使い果たされます。
ジェネレータは、大部分の目的で、結果をすべて事前に必ずしも把握していないイテレータです。これはgenerator expressionsに非常に有用である、あなたが実際にyieldキーワードでジェネレータを返す非常に単純な関数を書くことができます:
def odds():
x = 1
while True:
yield x
x += 2
os = odds()
os.next() # returns 1
os.next() # returns 3
これは良いことです、それはあなたがあなたのすべてのデータを格納する必要がないことを意味するので(odds()
の場合は不可能です...)、結果の最初の数要素だけが必要な場合は、残りの計算を煩わす必要はありません。 itertools
moduleにはイテレータを扱うための便利な機能があります。あなただけlinks
の内容を印刷したい場合、あなたは(反復可能を取り、その要素のリストを返す)list()
機能をリストに変換することができ
とにかく
、:
print list(links)
やリストの内包表記と文字列のリストにする:
print [l.url for l in list(links)]
またはその要素の上を歩くと、それらをプリントアウトする:
for l in links:
print l.url
しかし、あなたがこれを行った後、links
は「疲れ」になることに注意してください - ので、あなたが実際にそれで何かをしたい場合、あなたは再びそれを取得する必要があります。
多分最も簡単なオプションはすぐにそれはすべてのイテレータであることを心配リストにそれを回すとしないようにされています
links = list(br.links(url_regex="/people/"))
をまた、あなたは明らかにまだ持っているリンクを取得していませんあなたが望むクラス。そこここに「または」を行うには、いくつかのmechanize
トリックかもしれませんが、セットやジェネレータ式を使ってそれを行うには気の利いた方法は、このようなものになるだろう:
links = set(l.url for l in br.links(url_regex='/people/'))
links.update(l.url for l in br.get_links_with_class('office-holder'))
明らかにこれらのリンクを取得するための現実的な方法でget_links_with_class
を置き換えます。 URLに/people/
のリンクURLがあり、重複のないようにoffice-holder
のクラスがあります。 (Link
オブジェクトはハッシュ可能ではないため、セットに直接入れることはできません)。