需要帮助通过Nokogiri导出已解析的结果,并导出为CSV。只显示最后解析的结果,为什么?

时间:2013-05-15 22:35:53

标签: ruby nokogiri

这是在杀我,在这里搜索,而大G让我更加困惑。

我在Nokogiri的Railscasts #190上学习了教程,并且能够给自己写一个很好的小解析器:

require 'rubygems'
require 'nokogiri'
require 'open-uri'

url = "http://www.target.com/c/movies-entertainment/-/N-5xsx0/Ntk-All/Ntt-wwe/Ntx-matchallpartial+rel+E#navigation=true&facetedValue=/-/N-5xsx0&viewType=medium&sortBy=PriceLow&minPrice=0&maxPrice=10&isleaf=false&navigationPath=5xsx0&parentCategoryId=9975218&RatingFacet=0&customPrice=true"

doc = Nokogiri::HTML(open(url))
puts doc.at_css("title").text
doc.css(".standard").each do |item|

title = item.at_css("span.productTitle a")[:title]
format = item.at_css("span.description").text
price = item.at_css(".price-label").text[/\$[0-9\.]+/]
link = item.at_css("span.productTitle a")[:href]

puts "#{title}, #{format}, #{price}, #{link}"

end

我对结果感到满意,并且能够在Windows控制台中看到它。但是,我想将结果导出到CSV文件并尝试了很多方法(没有运气),我知道我错过了一些东西。我最新更新的代码(下载html文件后)如下:

require 'rubygems'
require 'nokogiri'
require 'csv'

@title = Array.new
@format = Array.new
@price = Array.new
@link = Array.new

doc = Nokogiri::HTML(open("index1.html"))
doc.css(".standard").each do |item|
@title << item.at_css("span.productTitle a")[:title]
@format << item.at_css("span.description").text
@price << item.at_css(".price-label").text[/\$[0-9\.]+/]
@link << item.at_css("span.productTitle a")[:href]
end

CSV.open("file.csv", "wb") do |csv|
csv << ["title", "format", "price", "link"]
csv << [@title, @format, @price, @link]
end

它为我工作并吐出一个文件,但只是最后一个结果。我按照Andrew!: WEb Scraping...上的教程进行了尝试,并尝试将我想要实现的内容与其他人的过程相混淆。

我认为它循环遍历所有结果,只打印最后一个。有人可以指点我应该如何循环(如果那是问题),以便所有结果都在各自的列中?

提前致谢。

2 个答案:

答案 0 :(得分:2)

您将值存储在四个数组中,但在生成输出时不会枚举数组。

这是一个可能的解决方法:

CSV.open("file.csv", "wb") do |csv|
  csv << ["title", "format", "price", "link"]
  until @title.empty?
    csv << [@title.shift, @format.shift, @price.shift, @link.shift]
  end
end

请注意,这是一个破坏性的操作,一次一个地从数组中移出值,所以最后它们都将为空。

有更有效的方法来读取和转换数据,但这有望实现您想要的目标。

答案 1 :(得分:2)

您可以通过“Ruby方式”更多地编写这些内容:

require 'rubygems'
require 'nokogiri'
require 'csv'

doc = Nokogiri::HTML(open("index1.html"))
CSV.open('file.csv', 'wb') do |csv|
  csv << %w[title format price link]
  doc.css('.standard').each do |item|
    csv << [
      item.at_css('span.productTitle a')[:title]
      item.at_css('span.description').text
      item.at_css('.price-label').text[/\$[0-9\.]+/]
      item.at_css('span.productTitle a')[:href]
    ]
  end
end

如果没有示例HTML,则无法对此进行测试,但是,根据您的代码,它看起来很有用。

请注意,在您的代码中,您使用的是实例变量。它们不是必需的,因为你没有定义一个类来拥有一个实例。您可以改用本地值。