2016-06-24 3 views
0

私はショップページを持っており、最初にすべての記事をリンクしたいと思っています。その後、各リンクのコンテンツをクロールしたいそれは私が正確なタグやエリアを検索するための最も簡単な方法ですので、私はCSSを使用して検索を使用してい機械化page.searchはlink.clickメソッドとは動作しません

agent = Mechanize.new 
page = agent.get(page_URL) 
article_links = page.search('div.sklep-produkt h3 a').attr('href') 

次のように私はリンクを取得しています。もし私がputs "#{article_links}"を置くと、私はすでにリンクを見ることができるので、それは働いている。問題はそのドンのuniqは、マップ、link.click、URIなどのようなメソッド」です

article_links.uniq { |link| link.uri }.map do |link| #no double entries 
    link.click 
    target_URL = page.uri + link.uri 
    puts "#{target_URL}" 
end 

:ページからので、私はこれを使用している - すべての記事のリンク - しかし、私は複数のリンクをしたいですpage.searchで作業します。エラー例:

undefined method `uri' for #<Nokogiri::XML::Attr:0x0055a7a4a7e440> (NoMethodError) 

page.links_with(...)でのみ可能です。 page.searchで複数のリンクをクロールするにはどうすればよいですか?

+0

あなたは配列にリンクを格納してから、それを 'link.array.each {| link | agent.get link} '?私は '.get'にブロックを追加することもできると思います。私はMechanizeを試して、はるかに簡単にWatirに切り替えるので、Mechanizeをほとんど知りません。 – mjwatts

答えて

1

のような何か...

# find the links 
article_links = page.css('div.sklep-produkt').css('h3').css('a') 

# store in a new array, and take out the un-uniques 
unique_article_links = article_links.map {|l| l.attribute('href').value }.uniq 

# visit each link and do whatever needs to be done 
unique_article_links.each do |link| 
    agent.get(link) do |l| 
    #... do stuff here 
    p l.css('title').text 
    end 
end 

私はウィキペディアでこれをテストし、それは私のために[OK]のタイトルを返しました:

url = 'https://en.wikipedia.org/wiki/Main_Page' 
agent = Mechanize.new 
page = agent.get(url) 

article_links = page.css('div#mp-tfa').css('a') 
unique_article_links = article_links.map {|l| l.attribute('href').value }.uniq 

unique_article_links.each do |link| 
    agent.get(link) do |l| 
    #... do stuff here 
    p l.css('title').text 
    end 
end 

何が起こっているが、それはそう、鋸山のオブジェクトではなく配列を返すだですNokogiriオブジェクトから必要な値を取り出して新しい配列に入れなければならない場合、Arrayメソッドを使用することができます。

+0

私はまだ「#<鋸山:: XML ::のAttr:0x0055ab97844958>のために(NoMethodError) または私はuniqの削除: 未定義のローカル変数やメソッド 'リンク 未定義のメソッド' uniqのようなエラーを取得していクローラのために:クラス(NameError) – GoYoshi

+1

これをテストした後、自分の答えを編集しました – mjwatts

関連する問題