2011-12-04 1 views
1

機械化を使用して特定のフォーマットに従って複数のページを開こうとしています。私は特定のページから始めたいと思っており、リンク内の特定のクラスやテキストを持つすべてのリンクを機械化しています。たとえば、ルートURLが複数のページをPythonで機械化して開く

http://hansard.millbanksystems.com/offices/prime-minister

ようなものになるだろうと私は言い換えれば

<li class='office-holder'><a href="http://hansard.millbanksystems.com/people/mr-tony-blair">Mr Tony Blair</a> May 2, 1997 - June 27, 2007</li> 

ような形式を持っているページ上のすべてのリンクをフォローしたい、私がフォローしたいですクラス 'office-holder'を持つか、/ people /がURLに含まれるすべてのリンク。私は次のコードを試しましたが、うまくいきませんでした。

私はリンクを印刷しようとしていますので、コードを書く前に正しいリンクや情報が得られるようにしています。このエラー(?)は次のとおりです。

<generator object _filter_links at 0x10121e6e0> 

いずれのポインタまたはヒントもありがとうございます。

答えて

2

これはエラーではありません。つまり、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オブジェクトはハッシュ可能ではないため、セットに直接入れることはできません)。

関連する問題