2011-09-20 6 views
5

おそらくそれを間違っている、または別のより効率的な方法があります。ここに私の問題があります:はnokogiriとのリンクをクリックすると困惑し、機械化

私はまず、ノコギリを使ってhtml文書を開き、クリックする必要があるリンクが見つかるまでそのcssを使って文書を横断します。

リンクを取得したら、どうすれば機械化してクリックするのですか?ドキュメントによると、文字列かMechanize :: Page :: LinkオブジェクトのどちらかがMechanize.newによって返されたオブジェクトです。

私は文字列を使うことができません - 同じリンクの100がある可能性があるので、機械化がnokogiriが横切ったリンクをクリックするだけです。

答えて

14

あなたが必要なリンク・ノードを発見した後、手動でMechanize::Page::Linkオブジェクトを作成することができ、その後、それをクリックしてください:@binarycodeオプションより

agent = Mechanize.new 
page = agent.get "http://google.com" 
node = page.search ".//p[@class='posted']" 
Mechanize::Page::Link.new(node, agent, page).click 
+0

をたどるには十分にスマートです。私の答えを見てください。 – Serabe

+0

私はこれが最も簡単ではない場合でも、場合によってはより良いと思います。ページには同じクラスのリンクがたくさんありましたが、別の表のセルを基準にして、その表のセルを基準にクリックしたリンクを知る必要がありました。だから私はノコリギにその細胞とその中のリンクを見いだすことができます。私は見たことのためにMechanize link_withでそれをすることはできません。 – Mortimer

5

簡単な方法は:

agent = Mechanize.new 
page = agent.get "http://google.com" 
page.link_with(:class => 'posted').click 
+1

あなたのアプローチは、リンクの検索に使用される条件が非常に単純な場合に最適です。ここで質問ポスターは文書を横断するためにnokogiriを使用するので、彼はnokogiri機能を使用できるソリューションを提供したので、正しいリンクを見つけるためのより複雑なロジックを実装できました。 – binarycode

+1

唯一の制限は、ノードが '.href'や' ['href'] 'や' ['src'] ' – Serabe

2

ですシンプルな、あなたは機械化を使用する必要はありませんlink_with().click

あなたはちょうどgetリンクとあなたのpageバリエーションを更新することができますでき

Mechanizeのは、内部的に現在の作業現場を保存し、それをローカルのリンク

行くための最善の方法ではありません

例:

agent = Mechanize.new 
page = agent.get "http://somesite.com" 

next_page_link = page.search('your exotic selectors here').first rescue nil #nokogyri object 
next_page_href = next_page_link['href'] rescue nil # '/local/link/file.html' 

page = agent.get(next_page_href) if next_page_href # goes to 'http://somesite.com/local/link/file.html' 
関連する問題