2016-06-24 4 views
0

쇼핑 페이지가 있으며 먼저 모든 기사를 링크로보고 싶습니다. 그 후에 각 링크의 콘텐츠를 크롤링하고 싶습니다. 그것은 나를 정확한 태그 또는 지역을 검색 할 수있는 가장 쉬운 방법이기 때문에 내가 CSS와 검색을 사용하고기계화 page.search가 link.click 메소드와 함께 작동하지 않습니다.

agent = Mechanize.new 
page = agent.get(page_URL) 
article_links = page.search('div.sklep-produkt h3 a').attr('href') 

다음과 같이 내가 링크를 얻고있다. 내가 puts "#{article_links}"을 넣으면 이미 링크를 볼 수 있으므로 작동합니다. 그러나, 나는 두 개 이상의 링크를 원하는 - 모든 문서 링크 -이 사용하고 있으므로 페이지 :

article_links.uniq { |link| link.uri }.map do |link| #no double entries 
    link.click 
    target_URL = page.uri + link.uri 
    puts "#{target_URL}" 
end 

문제는 그 UNIQ,지도, link.click, URI 같은 및 방법 그래서 돈에 대한 '를 page.search로 작업하십시오. 오류 예 :

undefined method `uri' for #<Nokogiri::XML::Attr:0x0055a7a4a7e440> (NoMethodError) 

page.links_with(...)으로 만 가능합니다. page.search으로 여러 링크를 크롤링하려면 어떻게해야합니까?

+0

배열에 링크를 저장하고 각 링크에서'agent.get'을 사용하여 반복적으로 시도해 보셨나요? links_array.each {| link | agent.get link}'? 나는 당신이 블록을 .get에 추가 할 수 있다고 생각한다. 나는 Mechanize를 시도하고 훨씬 더 쉽게 Watir로 전환 했으므로 Mechanize를 거의 알지 못합니다. 정의되지 않은 메서드'UNIQ 같은 – mjwatts

답변

1

뭔가 같은 ...

# find the links 
article_links = page.css('div.sklep-produkt').css('h3').css('a') 

# store in a new array, and take out the un-uniques 
unique_article_links = article_links.map {|l| l.attribute('href').value }.uniq 

# visit each link and do whatever needs to be done 
unique_article_links.each do |link| 
    agent.get(link) do |l| 
    #... do stuff here 
    p l.css('title').text 
    end 
end 

나는 위키 백과에이를 테스트하고 나를 위해 확인 제목을 반환

url = 'https://en.wikipedia.org/wiki/Main_Page' 
agent = Mechanize.new 
page = agent.get(url) 

article_links = page.css('div#mp-tfa').css('a') 
unique_article_links = article_links.map {|l| l.attribute('href').value }.uniq 

unique_article_links.each do |link| 
    agent.get(link) do |l| 
    #... do stuff here 
    p l.css('title').text 
    end 
end 

무엇 일어나고있는 것은, 그것이 노코 기리 객체가 아닌 배열을 반환 그래서입니다 Nokogiri 객체에서 원하는 값을 가져 와서 새로운 배열에 넣어야합니다. 그런 다음 Array 메서드를 사용할 수 있습니다.

+0

난 여전히지고있어 오류 '번호 <노코 기리 :: XML :: Attr의 : 0x0055ab97844958> (NoMethodError) 또는 내가 UNIQ 제거 할 때 : 정의되지 않은 지역 변수 또는 메소드'링크'크롤러를 들어 : 클래스 (NameError) – GoYoshi

+1

테스트 후 내 대답을 편집했습니다. – mjwatts