2011-09-20 15 views
5

być może robię to źle, lub jest inny skuteczniejszy sposób. Oto mój problem:wpadł na kliknięcie łącza z nokogiri i zmechanizował

Najpierw za pomocą nokogiri otwórz dokument HTML i użyj jego css do przechodzenia przez dokument, aż znajdę link, który muszę kliknąć.

Teraz, gdy już mam link, jak go użyć, kliknij "mechanize". Zgodnie z dokumentacją obiekt zwrócony przez Mechanize.new albo ciągiem albo obiektem Mechanize :: Page :: Link.

Nie mogę użyć łańcucha - ponieważ mogą istnieć 100-ki tego samego łącza - chcę tylko, aby mechanize kliknęło link, przez który przechodzi nokogiri.

Każdy pomysł?

Odpowiedz

14

Po znalezieniu węzeł łącza potrzeba, można ręcznie utworzyć obiekt Mechanize::Page::Link, i kliknij go potem:

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

To nie jest najlepsza droga. Spójrz na moją odpowiedź. – Serabe

+0

Myślę, że ten jest lepszy w niektórych przypadkach, nawet jeśli nie jest najłatwiejszy. Na stronie było wiele linków z tą samą klasą, ale musiałem wiedzieć, który z nich klikałem względem komórki tabeli, która była względem innej komórki tabeli. Mogę więc użytkownika Nokorigi znaleźć tę komórkę, a następnie link w niej. Nie mogę tego zrobić z Mechanize link_with z tego, co widziałem. – Mortimer

5

łatwiejszy sposób niż wariant @binarycode:

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

Twoje podejście jest najlepsze, gdy warunki, które są używane do znalezienia linku, są bardzo proste. Tutaj plakat z pytaniem używa nokogiri do przechodzenia przez ten dokument, więc dostarczyłem rozwiązanie, w którym mógłby korzystać z funkcji nokogiri, dzięki czemu można zaimplementować bardziej złożoną logikę do znalezienia poprawnego łącza. – binarycode

+1

Jedynym ograniczeniem jest to, że węzeł musi odpowiadać na '.href' lub' ['href'] 'lub' ['src']. – Serabe

2

To jest proste, nie musisz używać zmechanizowanego narzędzia, aby uzyskać dostęp do łącza Link i zaktualizować wersję page stanie

Mechanize zapisuje aktualną witrynę roboczą wewnętrznie, więc jest wystarczająco inteligentny, aby przestrzegać lokalnych powiązań

Np .:

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' 
Powiązane problemy