打开多个html文件&用Nokogiri输出到.txt

时间:2014-05-31 06:13:27

标签: html ruby parsing xpath nokogiri

想知道这两个函数是使用Nokogiri还是通过更基本的Ruby命令完成的。

require 'open-uri'
require 'nokogiri'
require "net/http"
require "uri"

doc = Nokogiri.parse(open("example.html"))

doc.xpath("//meta[@name='author' or @name='Author']/@content").each do |metaauth|
puts "Author: #{metaauth}"
end

doc.xpath("//meta[@name='keywords' or @name='Keywords']/@content").each do |metakey|
puts "Keywords: #{metakey}"
end

etc...

问题1:我只是试图解析.html文档的目录,从meta html标记中获取信息,并在可能的情况下将结果输出到文本文件。我尝试了一个简单的* .html通配符替换,但这似乎不起作用(至少不与Nokogiri.parse(open())可能它适用于:: HTML或:: XML)

问题2:但更重要的是,是否可以将所有这些元内容输出输出到文本文件中以替换puts命令?

如果代码对于执行的简单任务过于复杂,也请原谅我,但我对Nokogiri / xpath / Ruby有点新鲜。

感谢。

2 个答案:

答案 0 :(得分:0)

我有类似的代码 请参阅:

module MyParser
  HTML_FILE_DIR = `your html file dir`
  def self.run(options = {})
    file_list = Dir.entries(HTML_FILE_DIR).reject { |f| f =~ /^\./ }

    result = file_list.map do |file|
      html = File.read("#{HTML_FILE_DIR}/#{file}")
      doc = Nokogiri::HTML(html)
      parse_to_hash(doc)
    end
    write_csv(result)
  end

  def self.parse_to_hash(doc)
    array = []
    array << doc.css(`your select conditons`).first.content
    ... #add your selector code css or xpath

    array
  end

  def self.write_csv(result)
    ::CSV.open("`your out put file name`", 'w') do |csv|
      result.each { |row| csv << row }
    end
  end
end

MyParser.run

答案 1 :(得分:0)

您可以输出到这样的文件:

File.open('results.txt','w') do |file|
  file.puts "output"   # See http://ruby-doc.org/core-2.1.2/IO.html#method-i-puts
end

或者,您可以执行以下操作:

authors = doc.xpath("//meta[@name='author' or @name='Author']/@content")
keywrds = doc.xpath("//meta[@name='keywords' or @name='Keywords']/@content")
results = authors.map{ |x| "Author: #{x}"   }.join("\n") +
          keywrds.map{ |x| "Keywords: #{x}" }.join("\n")
File.open('results.txt','w'){ |f| f << results }