我有以下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不包含任何内容。有谁知道为什么这不起作用?
非常感谢
答案 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正确解析文件。