2

我有以下红宝石脚本:

require "rubygems"
require "rest-client" #although not required in the program
require "open-uri"
require "nokogiri"


puts "Opening file"
page=File.open("file.html","r"){|file| file.read}
puts page
    page = Nokogiri::HTML(page)
    puts page.class
    #Filters content of page to select all references to the documents filing date
    td_rows = page.css('td i.blue')
    puts td_rows

我可以从 CodeRunner 或 TextWrangler 运行此脚本,并使用 ruby​​ 'filename' 从终端调用它。但是,我试图让脚本在某个时间点运行,并尝试使用 Keyboard Maestro 或 Platypus 调用脚本,但尽管它运行它似乎并没有完成该行

td_rows = page.css('td i.blue')

变量 td_rows 不包含任何内容。有谁知道为什么这不起作用?

非常感谢

4

2 回答 2

0

如果您的代码无法读取该文件,Nokogiri 在尝试解析空字符串时仍会创建一个空 HTML 文档:

[2] (pry) main: 0> Nokogiri::HTML('')
=> #(Document:0x245962c {
  name = "document",
  children = [ #(DTD:0x24ab210 { name = "html" })]
  })
[3] (pry) main: 0> Nokogiri::HTML('').to_html
=> "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n\n"

并且,此时,当您查看它的类时,您将获得一个 Nokogiri::HTML 文档:

[4] (pry) main: 0> Nokogiri::HTML('').class
=> Nokogiri::HTML::Document

所以检查类名对puts page.class你没有任何好处。并且,寻找单元格将返回空:

[3] (pry) main: 0> Nokogiri::HTML('').css('td i.blue')
=> []

就个人而言,如果您想知道您是否阅读过文档,请查看是否有任何字符:

abort("Got nothing") if page.empty?

而不是打印内容或查看 document.class。

另外,我会使用page = File.read('file.html')而不是File.open,但这只是我。

这一切都指向文件未找到或为空。您可以使用类似的东西File.exists?('file.html')来查找它的存在并File.size('file.html')在继续之前检查它是否有内容。

于 2012-08-06T17:51:26.350 回答
0

我设法找出为什么 nokogiri 解析不起作用。

出于某种原因,如果该页面是从 Web 打开的,则该脚本可以运行,但如果该网页先保存到磁盘然后再打开,则该脚本不会运行。我发现当从磁盘打开页面时,它遇到了 nokogiri 错误,并且只读取并解析了文件的前几行。该错误是由于 html 注释未在同一行而是在后续行关闭。

我设法通过使用模式“rb”而不是“r”读取文件来克服这个问题。即,如果我将 file.open 行替换为:

page=File.open("file.html","rb"){|file| file.read}

nokogiri 正确解析文件。

于 2012-09-10T16:43:38.460 回答