2016-06-24 10 views
0

Ich habe eine Shop-Seite und möchte alle Artikel als Link zuerst sehen. Danach möchte ich den Inhalt jedes Links crawlen. Ich erhalte die Links wie folge:Mechanize page.search funktioniert nicht mit link.click-Methode

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

Ich verwende Suche mit CSS, da es der einfachste Weg für mich ist für einen genauen Tag oder einen Bereich zu suchen. Wenn ich eine puts "#{article_links}" stelle, kann ich bereits einen Link sehen, also funktioniert es. Allerdings möchte ich mehr als einen Link - alle Artikel Links - von der Seite so verwende ich diese:

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

Das Problem ist, dass Methoden wie uniq, Karte, link.click, uri und so weiter don‘ t arbeiten mit page.search. Beispiel Fehler:

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

Es ist nur möglich mit page.links_with(...). Wie crawle ich mehrere Links mit page.search? wie

+0

haben Sie versucht, die Links in einem Array zu speichern und dann mit einem 'agent.get' auf jedem Link zu iterieren, etwas wie' links_array.each {| link | agent.get link} '? Ich denke du kannst auch einen Block zum '.get' hinzufügen. Ich habe Mechanize ausprobiert und stattdessen Watir viel einfacher umgestellt, damit Mechanize kaum noch kennt. – mjwatts

Antwort

1

Etwas ...

# 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 

ich dies auf Wikipedia getestet und es zurück Titel ok für mich:

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 

Was passiert, ist es ein Nokogiri Objekt und nicht ein Array zurückkehrt, so Sie müssen die gewünschten Werte vom Nokogiri-Objekt übernehmen und ein neues Array einfügen, dann können Sie Array-Methoden verwenden.

+0

Ich bin immer noch Fehler wie nicht definierte Methode 'uniq bekommen‘ für # (NoMethodError) oder wenn ich entfernen uniq: undefined lokale Variable oder Methode 'Links' für Crawler: Klasse (NameError) – GoYoshi

+1

Ich habe meine Antwort nach dem Testen bearbeitet – mjwatts