2012-05-08 13 views
6

Mam problemy z mechanizacją. Chciałbym "kliknąć" na zestaw linków, które można zidentyfikować tylko na podstawie ich pozycji (wszystkie linki w obrębie div # content) lub ich href.Korzystanie z narzędzia Mechanize gem w celu zwrócenia kolekcji linków na podstawie ich pozycji w DOM

Próbowałem powyższych metod identyfikacji powyżej bez powodzenia.

Z dokumentacji nie mogłem dowiedzieć się, w jaki sposób zwrócić kolekcję linków (do klikania) na podstawie ich pozycji w DOM, a nie według atrybutów bezpośrednio na łączu.

drugie documentation zaproponował można użyć: href dopasować częściowy href,

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

ale to jedyny sposób mogę zmusić go do powrotu link jest przez przepuszczanie w pełni kwalifikowany adres URL, np

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

to nie jest bardzo przydatne, jeśli chcę wrócić zbiór linków z href na

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

Czy robię coś nie tak? czy mam nierealistyczne oczekiwania?

Odpowiedz

8

Część II Wartość, którą należy przekazać do: href musi być dopasowaniem ścisłym domyślnie. Więc href w twoim przykładzie pasowałby tylko do: <a href="/something"></a>, a nie <a href="foo.com/something/a"></a>

To, co chcesz zrobić, to przekazać wyrażenie, aby dopasować podciąg w polu href. Tak:

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

edit: Część I Aby zmusić go do wyboru linki tylko w link, dodać nokogiri stylu metodę wyszukiwania do swojego łańcucha. Tak:

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

Ok, to nie działa, ponieważ po wykonaniu page = agent.get('http://foo.com/').search("div#content") dostaniesz Nokogiri obiekt z powrotem zamiast mechanize jednym, więc links_with nie będzie działać. Jednak będziesz mógł wyodrębnić linki z obiektu Nokogiri za pomocą metody css. Proponuję coś takiego:

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

Jeśli to nie zadziała, bym sugerujemy sprawdzanie http://nokogiri.org/tutorials

+2

Dokumentacja dotycząca zmechanizowanego może zostać ulepszona w tym punkcie. – vlasits

+0

Dzięki, czy masz pojęcie o drugiej części mojego pytania, na temat powracających linków na podstawie ich pozycji DOM? – pingu

+0

Edytowałem powyżej, aby odpowiedzieć na obie części pytania. – vlasits

2

nta link:

page.links[n-1] 

Pierwsze 5 Linki:

page.links[0..4] 

linki z "coś" w href:

page.links_with :href => /something/ 
1

Można uzyskać mechanize linki za pomocą Nokogiri węzłów.Zobacz 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 

To znaczy:

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

To daje przydatnych href, tekst i metod Uri.

+0

Nokogiri :: CSS :: SyntaxError: nieoczekiwany '@href' po '[#

Powiązane problemy