Nokogiri和XPath:保存刮擦的文本结果

时间:2013-12-27 02:47:52

标签: ruby xpath nokogiri yaml

我想将文件的文本结果保存在文件中。这是我目前的代码:

require "rubygems"
require "open-uri"
require "nokogiri"

class Scrapper
  attr_accessor :html, :single

  def initialize(url)
    download = open(url)
    @page = Nokogiri::HTML(download)
    @html = @page.xpath('//div[@class = "quoteText"andfollowing-sibling::div[1][@class = "quoteFooter" and .//a[@href and normalize-space() = "hard-work"]]]')
  end

  def get_quotes
    @quotes_array = @html.collect {|node| node.text.strip}
    @single = @quotes_array.each do |quote|
      quote.gsub(/\s{2,}/, " ") 
    end
  end
end

我知道我可以写一个这样的文件:

File.open('text.txt', 'w') do |fo|
    fo.write(content)

但是我不知道如何合并@single来保存我的结果。最终目标是将信息插入数据库。

我遇到过一些使用Yaml的人,但我发现很难按照步骤指导。

有人能指出我正确的方向吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

只需使用:

@single = @quotes_array.map do |quote|
  quote.squeeze(' ')
end

File.open('text.txt', 'w') do |fo|
  fo.puts @single
end

或者:

File.open('text.txt', 'w') do |fo|
  fo.puts @quotes_array.map{ |q| q.squeeze(' ') }
end

并且不打扰创建@single

或者:

File.open('text.txt', 'w') do |fo| 
  fo.puts @html.collect { |node| node.text.strip.squeeze(' ') }
end

并且不用费心去创建@single@quotes_array

squeeze是String类的一部分。这来自the documentation

"  now   is  the".squeeze(" ")         #=> " now is the"