1

このルビースクリプトは、メーカーのWebサイトから製品情報を取得するために作成しました。配列内の製品オブジェクトのスクレイピングとストレージは機能しますが、配列データをcsvファイルにエクスポートする方法がわかりません。このエラーがスローされています:scraper.rb:45:main:Objectの未定義のメソッド `send_data'(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" 
4

3 に答える 3

1

Rubyを初めて使用する場合は、Ruby 1.9以降を使用する必要があります。その場合、高速csvとl18nサポートを組み込んだ組み込みのCSV出力を使用できます。

require 'csv'
CSV.open('filename.csv', 'w') do |csv|
  csv << [sku, name, desc]
end

http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV.html

于 2013-09-23T19:20:20.300 に答える
0
File.open('filename.csv', 'w') do |f|
  f.write(csv_data)
end
于 2012-05-21T03:19:12.813 に答える
0

おそらく、次のことを行う方が理にかなっています。

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

そして、あなたが進むにつれてそれに書き込みます:

@csv << [sku, name, desc]

そうすれば、スクリプトが途中でクラッシュした場合でも、少なくともデータの半分を取得できます。

于 2012-05-21T03:42:32.287 に答える