2011-09-20 9 views
5

quizás lo estoy haciendo mal, o hay otra manera más eficiente. Aquí está mi problema:perplejo al hacer clic en un enlace con nokogiri y mecanizar

Primero, usando nokogiri, abro un documento html y uso su CSS para recorrer el documento hasta que encuentre el enlace que necesito hacer clic.

Ahora, una vez que tengo el enlace, ¿cómo uso mechanize para hacer clic en él? De acuerdo con la documentación, el objeto devuelto por Mechanize.new ya sea la cadena o un objeto Mechanize :: Page :: Link.

No puedo usar una cadena, ya que podría haber 100 del mismo enlace, solo quiero mecanizar para hacer clic en el enlace que fue atravesado por nokogiri.

¿Alguna idea?

Respuesta

14

Después de haber encontrado el nodo enlace que necesita, puede crear el objeto Mechanize::Page::Link manualmente y haga clic en él después:

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

Ese no es el mejor camino a seguir. Eche un vistazo a mi respuesta. – Serabe

+0

Creo que este es mejor en algunos casos, incluso si no es el más fácil. Había muchos enlaces con la misma clase en la página, pero necesitaba saber con cuál estaba haciendo clic en relación con la celda de la tabla en la que se encontraba en relación con otra celda de la tabla. Así que puedo usar Nokorigi para encontrar esa celda y luego el enlace dentro de ella. No puedo hacer eso con Mechanize link_with por lo que he visto. – Mortimer

5

manera más fácil de lo simple, no necesita usar mecanizar link_with().click

Puede simplemente get el enlace y actualizar su page vari capaces

Mechanize ahorra sitio de trabajo actual internamente, por lo que es lo suficientemente inteligente como para seguir los enlaces locales

Ej .:

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' 
+1

Su enfoque es mejor cuando las condiciones que se utilizan para encontrar el enlace son muy simples. Aquí, el cartel de la pregunta usa nokogiri para recorrer el documento, así que proporcioné la solución donde podría usar las características de nokogiri, por lo que podría implementarse una lógica más compleja para encontrar el enlace correcto. – binarycode

+1

La única limitación es que el nodo debe responder a '.href' o' ['href'] 'o' ['src'] ' – Serabe

2

Eso es: opción @binarycode

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