2012-05-21 6 views
1

이 루비 스크립트를 작성하여 제조업체 웹 사이트에서 제품 정보를 긁어 냈습니다. 배열에서 제품 객체의 스크래핑과 저장이 작동하지만 배열 데이터를 csv 파일로 내보내는 방법을 알 수 없습니다. 이 오류는 다음과 같이 throw됩니다. scraper.rb : 45 : 정의되지 않은 메소드 send_data for main : Object (NoMethodError)루비 스크레이퍼. CSV로 내보내는 방법?

이 코드는 이해할 수 없습니다. 왜이 일을하고 있으며 왜 제대로 작동하지 않습니까?

send_data csv_data, 
      :type => 'text/csv; charset=iso-8859-1; header=present', 
      :disposition => "attachment; filename=products.csv" 

전체 코드 :

@csv = FasterCSV.open('filename.csv', 'w') 

을하고 진행하면서 다음에 쓰기 :

#!/usr/bin/ruby 

require 'rubygems' 
require 'anemone' 
require 'fastercsv' 

productsArray = Array.new 

class Product 
    attr_accessor :name, :sku, :desc 
end 

# Scraper Code 

Anemone.crawl("http://retail.pelicanbayltd.com/") do |anemone| 
    anemone.on_every_page do |page| 

     currentPage = Product.new 

     #Product info parsing 
     currentPage.name = page.doc.css(".page_headers").text 
     currentPage.sku = page.doc.css("tr:nth-child(2) strong").text 
     currentPage.desc = page.doc.css("tr:nth-child(4) .item").text 

     if currentPage.sku =~ /#\d\d\d\d/ 
      currentPage.sku = currentPage.sku[1..-1] 
      productsArray.push(currentPage) 
     end 
    end 
end 

# CSV Export Code 

products = productsArray.find(:all) 
csv_data = FasterCSV.generate do |csv| 
    # header row 
    csv << ["sku", "name", "desc"] 

    # data rows 
    productsArray.each do |product| 
     csv << [product.sku, product.name, product.desc] 
    end 
    end 

    send_data csv_data, 
      :type => 'text/csv; charset=iso-8859-1; header=present', 
      :disposition => "attachment; filename=products.csv" 
+0

send_data 메소드에 대한 참조는 어디에서 보았습니까? 왜 그것이 효과가 있다고 생각 했습니까? 이메일을 보내는 것에서 나온 것처럼 보입니까? CSV 데이터는'csv_data'에 있습니다. 너는 그걸로 무엇을하고 싶니? 파일에서 원한다면 파일을 열고 그것에 쓰십시오. –

+0

@MarkReed : ['send_data'] (http://api.rubyonrails.org/classes/ActionController/DataStreaming.html#method-i-send_data) –

+0

아, 물론 알았어 야 할 것은 ActionSomething 메소드입니다. 루비 (Ruby)의 양날 검인 레일즈 (Rails)에 감사드립니다. –

답변

0
File.open('filename.csv', 'w') do |f| 
    f.write(csv_data) 
end 
+0

나는 샘플 코드에서 그것을 얻었다. 지금 일하는 데 도움을 주셔서 감사합니다. 여기 멍청한 놈 – Dan

0

그것은 아마도 할 더 의미

@csv << [sku, name, desc] 

그런 식으로 스크립트가 중간에 충돌하면 적어도 데이터의 절반을 얻었습니다. 당신이 사용할 수있는 경우에 당신이 루비를 처음 사용하는 경우

관련 문제