2011-09-20 4 views
5

기계가 아마 잘못되었거나 다른 효율적인 방법이 있습니다. 여기 내 문제가 있습니다 :은 nokogiri와의 링크를 클릭하면 곤란 해지고

먼저, nokogiri를 사용하여 html 문서를 열고 클릭해야 할 링크가 발견 될 때까지 해당 css를 사용하여 문서를 트래버스합니다.

이제 링크가 생기면 그것을 클릭하기 위해 기계화를 어떻게 사용합니까? 문서에 따르면, Mechanize.new에 의해 반환 된 객체는 문자열 또는 Mechanize :: Page :: Link 객체 중 하나입니다.

문자열을 사용할 수 없습니다. 동일한 링크가 100 개 이상있을 수 있기 때문에 기계화가 nokogiri에서 가로 지르는 링크를 클릭하기 만하면됩니다.

아이디어가 있으십니까? 당신이 필요로하는 링크 노드를 발견 한 후

답변

14

, 당신은 수동으로 Mechanize::Page::Link 객체를 생성 할 수 있고, 나중에 그것을 클릭

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

에 따라 충분히 똑똑하다. 내 대답 좀 봐. – Serabe

+0

나는 이것이 가장 쉽지는 않지만 어떤 경우에는 더 좋다고 생각한다. 페이지에 같은 클래스의 링크가 많이 있었지만 다른 테이블 셀에 비해 상대적으로 클릭 한 셀을 알 수 있어야했습니다. 그래서 Nokorigi 사용자가 그 셀과 링크를 찾을 수 있습니다. 나는 Mechanize link_with를 통해 내가 본 것을 할 수는 없다. – Mortimer

5

쉬운 방법 @binarycode 옵션보다 간단한, 당신은 기계화를 사용하지 않아도됩니다 link_with().click

당신은 단지 get의 링크와 page vari 수

기계화는 내부적으로 현재 작업 사이트를 저장, 그래서 지역의 링크

갈 수있는 가장 좋은 방법이 아니다

예 :

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

당신의 접근법은 링크를 찾는 데 사용되는 조건이 매우 간단 할 때 가장 좋습니다. 여기서 질문 포스터는 nokogiri를 사용하여 문서를 탐색하므로 nokogiri 기능을 사용할 수있는 솔루션을 제공하므로 올바른 링크를 찾는 데 더 복잡한 논리를 구현할 수 있습니다. – binarycode

+1

그런 다음 노드가'.href' 또는'[ 'href']'또는'[ 'src']'에 응답해야한다는 유일한 제한이 있습니다. – Serabe

2

입니다 :

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