2012-05-08 11 views
6

Estoy luchando con el mecanizado. Deseo hacer "clic" en un conjunto de enlaces que solo pueden identificarse por su posición (todos los enlaces dentro del contenido div #) o su href.Usando la gema Mechanize para devolver una colección de enlaces según su posición en el DOM

He intentado estos dos métodos de identificación anteriormente sin éxito.

De la documentación, no pude averiguar cómo devolver una colección de enlaces (para hacer clic) en función de su posición en el DOM, y no por atributos directamente en el enlace.

En segundo lugar, la documentation sugirió que puede que utilice: href para que coincida a href parcial,

page = agent.get('http://foo.com/').links_with(:href => "/something") 

pero la única manera que puedo conseguir que vuelva un enlace es pasando una dirección URL completa, por ejemplo

page = agent.get('http://foo.com/').links_with(:href => "http://foo.com/something/a") 

Esto no es muy útil si lo que quiero para devolver una colección de enlaces con href de

http://foo.com/something/a 
http://foo.com/something/b 
http://foo.com/something/c 
etc... 

¿Estoy haciendo algo mal? ¿Tengo expectativas poco realistas?

Respuesta

8

Parte II El valor que pasa a: href tiene que ser una coincidencia exacta por defecto. Entonces el href en su ejemplo solo coincidiría con <a href="/something"></a> y no con <a href="foo.com/something/a"></a>

Lo que quiere hacer es pasar una expresión regular para que coincida con una subcadena dentro del campo href. De este modo:

page = agent.get('http://foo.com/').links_with(:href => %r{/something/}) 

edición: Parte I Con el fin de conseguirlo para seleccionar enlaces sólo en un enlace, añadir un método de búsqueda de estilo nokogiri en su cadena. De esta manera:

page = agent.get('http://foo.com/').search("div#content").links_with(:href => %r{/something/}) # ** 

Ok, eso no funciona, porque después de hacer page = agent.get('http://foo.com/').search("div#content") se obtiene una Nokogiri objeto de nuevo en lugar de un mecanizar uno, por lo links_with no va a funcionar. Sin embargo, podrá extraer los enlaces del objeto Nokogiri utilizando el método css. Yo sugeriría algo así como:

page = agent.get('http://foo.com/').search("div#content").css("a")

Si eso no funciona, yo sugiero revisar http://nokogiri.org/tutorials

+2

La documentación sobre el mecanizado podría mejorarse en este punto. – vlasits

+0

Gracias, ¿tiene alguna idea sobre la otra parte de mi pregunta, al devolver enlaces según su posición DOM? – pingu

+0

He editado arriba para responder ambas partes de la pregunta. – vlasits

2

El enlace enésimo:

page.links[n-1] 

Los primeros 5 enlaces:

page.links[0..4] 

enlaces con 'algo' en el href:

page.links_with :href => /something/ 
1

Puede obtener enlaces mecanizados utilizando nodos nokogiri.Ver el source code of links() method.

# File lib/mechanize/page.rb, line 352 
def links 
    @links ||= %w{ a area }.map do |tag| 
    search(tag).map do |node| 
     Link.new(node, @mech, self) 
    end 
    end.flatten 
end 

Así que eso significa:

the_links= page.search("valid_selector") do |nl| 
    Mechanize::Page::Link.new(nl, agent, page) 
end 

Esto le dará el href útil, texto y métodos URI.

+0

Nokogiri :: CSS :: SyntaxError: inesperado '@href' después de '[#

Cuestiones relacionadas