ruby没有正确地从终端执行

时间:2012-08-02 17:53:21

标签: ruby nokogiri platypus

我有以下ruby脚本:

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不包含任何内容。有谁知道为什么这不起作用?

非常感谢

2 个答案:

答案 0 :(得分: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')在继续之前检查其是否包含内容。

答案 1 :(得分:0)

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

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

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

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

nokogiri正确解析文件。