私はこれを可能な限り最もpythonicな方法で書こうとしていますが、ラムダ(およびそれらを組み合わせることができるもの)について学んでいて、いくつかの問題を抱えています。
モジュールを使用してmechanize
、選択コントロールの Web サイトをスクレイピングし、各オプション値をフォームに送信して、結果のコンテンツを読み取ろうとしています (おそらく、1 つの小さなステートメントに対してやりすぎているのかもしれません)。これが私が持っているものです:
f = "ctl00$holdSection$selSubAgentFilter" #the select box field name
self.br.select_form(nr=0) #make the form selection in the browser instance
#here's where the magic is done
map( (lambda item,f=f: print(self.br.form.find_control( f ).items[ item[0] ].selected.submit().read() ) ), enumerate( self.br.find_control( f ).items ) )
だから、それを分解するために、私は次のことをしようとしています:
- enumerate を使用してコントロールから項目を取得し、列挙されたリストを
map
関数に送信して、基本的に各リスト項目を「ウォーク」することにより、選択フィールドの各オプションを反復処理します。 map
実行された関数にラムダ関数を使用する- 項目リスト (インデックスを取得するために列挙されたもの) をラムダ関数に送信します
- 渡されたアイテムの列挙インデックスを使用して、フォーム コントロール内のアイテムを選択し、それを選択します。
- フォームを送信する
- 新しいブラウザ ウィンドウの内容を読み取り、
print()
stdout に戻します
もちろん、この場合、selected
チェーンされたメソッドのプロパティはブール値に評価され、次のエラーが発生します。
AttributeError: 'bool' object has no attribute 'submit'
しかし、あなたは私が達成しようとしていることのアイデアを得るでしょう.できればそこから離れてください。私は、最も簡単な方法ではなく、最もpythonicな方法で問題を分岐して克服しようとしています。
何かご意見は?