【问题标题】:Ruby scraper. How to export to CSV?红宝石刮刀。如何导出为 CSV?
【发布时间】:2012-05-21 02:59:19
【问题描述】:

我编写了这个 ruby​​ 脚本来从制造商网站上抓取产品信息。产品对象在数组中的抓取和存储工作,但我不知道如何将数组数据导出到 csv 文件。抛出此错误: scraper.rb:45: main:Object (NoMethodError) 的未定义方法“send_data”

我不明白这段代码。这是在做什么,为什么不能正常工作?

  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" 

【问题讨论】:

  • 您在哪里看到对send_data 方法的任何引用?为什么你认为这会奏效?看起来它来自发送电子邮件的东西? csv_data 中有您的 CSV 数据;你想用它做什么?如果你想要它在一个文件中,打开一个文件并写入它。
  • @MarkReed: send_data
  • 啊,我当然应该知道 - ActionSomething 方法。谢谢你,Rails,Ruby 的双刃剑。
  • @MarkReed:我会是最后一个对 Rails 文档说任何好话的人,但api.rubyonrails.org顶部有一个搜索框
  • @muistooshort:一旦我知道我正在使用 Rails,就不会抱怨如何在 Rails 中做事。我喜欢Rails。这把剑的对立面是大量新手误以为 Rails == Ruby,并试图在他们的框架之外使用所有这些有用的方法。

标签: ruby fastercsv scraper anemone


【解决方案1】:

如果您是 Ruby 新手,您应该使用 Ruby 1.9 或更高版本,在这种情况下,您可以使用内置 CSV 输出,它内置了快速 csv 和 l18n 支持:

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

【讨论】:

    【解决方案2】:
    File.open('filename.csv', 'w') do |f|
      f.write(csv_data)
    end
    

    【讨论】:

    • 我是从示例代码中获取的。感谢你们俩的帮助,我现在让它工作了。菜鸟在这里
    【解决方案3】:

    这样做可能更有意义:

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

    然后边写边写:

    @csv << [sku, name, desc]
    

    这样,如果您的脚本在中途崩溃,您至少获得了一半的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多