Рубиновый скребок. Как экспортировать в CSV?
Я написал этот рубиновый скрипт, чтобы собрать информацию о продукте с сайта производителя. Очистка и хранение объектов продукта в массиве работает, но я не могу понять, как экспортировать данные массива в файл CSV. Выдается эта ошибка: scraper.rb:45: неопределенный метод `send_data'для main:Object (NoMethodError)
Я не понимаю этот кусок кода. Что это делает и почему не работает правильно?
send_data csv_data,
:type => 'text/csv; charset=iso-8859-1; header=present',
:disposition => "attachment; filename=products.csv"
Полный код:
#!/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"
3 ответа
Если вы новичок в Ruby, вы должны использовать Ruby 1.9 или более позднюю версию, и в этом случае вы можете использовать встроенный выход CSV, который встроен в поддержку быстрой CSV плюс l18n:
require 'csv'
CSV.open('filename.csv', 'w') do |csv|
csv << [sku, name, desc]
end
Вероятно, имеет больше смысла сделать:
@csv = FasterCSV.open('filename.csv', 'w')
и затем напишите ему, как вы идете вместе:
@csv << [sku, name, desc]
таким образом, если ваш сценарий потерпит неудачу на полпути, вы получите хотя бы половину данных.