2017-11-12 4 views
0

Ich weiß, wie man ein Element mit Nokogiri findet. Ich weiß, wie man mit Mechanize auf einen Link klickt. Aber ich kann nicht herausfinden, wie man einen bestimmten Link findet und darauf klickt. Das scheint so, als sollte es wirklich einfach sein, aber aus irgendeinem Grund kann ich keine Lösung finden.Wie kann ich auf einen bestimmten Link mit Nokogori oder Mechanize klicken?

Sagen wir, ich versuche nur auf das erste Ergebnis einer Google-Suche zu klicken. Ich kann nicht einfach auf den ersten Link mit Mechanize klicken, da die Google-Seite eine Reihe anderer Links enthält, z. B. Einstellungen. Die Suchergebnislinks selbst scheinen keine Klassennamen zu haben, aber sie sind in <h3 class="r"></h3> eingeschlossen.

Ich kann nur Nokogiri verwenden, um den href Wert des Link zu folgen, wie so:

document = open("https://www.google.com/search?q=stackoverflow") 
parsed_content = Nokogiri::HTML(document.read) 
href = parsed_content.css('.r').children.first['href'] 
new_document = open(href) 
# href is equal to "/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;url=https%3A%2F%2Fstackoverflow.com%2F" 

aber es ist nicht eine direkte URL und gibt einen Fehler zu dieser URL gehen. Der data-href Wert ist eine direkte URL, aber ich kann nicht herausfinden, wie man diesen Wert bekommt - das Gleiche zu tun, außer mit ...first['data-href'] gibt nil zurück.

Wer weiß, wie ich das erste .r Element auf der Seite finden und den Link darin klicken kann?

Hier ist der Start in meine Aktion:

require 'open-uri' 
require 'nokogiri' 
require 'mechanize' 
document = open("https://www.google.com/search?q=stackoverflow") 
parsed_content = Nokogiri::HTML(document.read) 

Hier ist das .r Element auf der Suchergebnisseite von Google:

<h3 class="r"> 
    <a href="/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;url=https%3A%2F%2Fstackoverflow.com%2F" data-href="https://stackoverflow.com/">Stack Overflow</a> 
</h3> 

Antwort

0

Sie sollten Ihre Frage ist der richtige Code in Ihrem Beispiel stellen Sie sicher, - Es sieht so aus, als wäre es nicht, weil Sie die URL nicht in Anführungszeichen setzen und der CSS-Selektor ist .r a nicht r. Sie verwenden .r a, weil Sie auf den Link innerhalb von Elementen mit der Klasse r zugreifen möchten.

Wie auch immer, können Sie den Ansatz detaillierte here wie so verwenden:

require 'open-uri' 
require 'nokogiri' 
require 'uri' 

base_url = "https://www.google.com/search?q=stackoverflow" 
document = open(base_url) 
parsed_content = Nokogiri::HTML(document.read) 
href = parsed_content.css('.r').first.children.first['href'] 
new_url = URI.join base_url, href 
new_document = open(new_url) 

Getestet habe ich diese und folgende new_url zu Stackoverflow nicht umleiten, wie erwartet.

+0

Guter Fang, ich tippte statt kopieren + einfügen. Das ist seltsam, aber dieser genaue Code funktioniert nicht für mich, aber mit '('.r'). First.children.first ['href']' und nur 'href' anstelle von' href.value' . –

+0

@JosefKrazinsky du hast Recht, muss einen Fehler beim Kopieren-Einfügen selbst gemacht haben –

Verwandte Themen