【问题标题】:ruby not executing from terminal correctly红宝石没有从终端正确执行
【发布时间】:2012-08-02 17:53:21
【问题描述】:

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

非常感谢

【问题讨论】:

  • 您能否更清楚地了解它是如何不工作的?它从终端运行正常吗?脚本根本没有运行还是只是“td_rows = page.css('td i.blue') 行不起作用?从终端运行时是否有任何错误?
  • 当您的工具调用时,您确定它与 file.html 在同一目录中运行吗?
  • 它可以从终端完美运行,但是,如果我通过键盘大师或鸭嘴兽运行它,脚本会执行它的 puts,“page”变量是一个 nokogiri 元素,但它不会更新变量 td_rows . ruby 脚本与 HTML 文件不在同一目录中,但它可以从终端运行它,所以我希望它在从键盘大师调用时运行。
  • 运行代码后,不是从终端,而是从 Keyboard Maestro 或 Platypus,你看到puts page 语句的输出了吗?
  • 是的,当从 Platypus 或 KM 运行时,puts 页面确实会显示输出

标签: ruby nokogiri platypus


【解决方案1】:

如果您的代码无法读取文件,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') 来检查它是否有内容,然后再继续。

【讨论】:

  • 感谢您的回复。我认为正在阅读文档,因为“放置页面”按预期输出页面。
  • 好吧,因为我们不知道“file.html”文件中的内容,所以我们无法帮助您使用 CSS 访问器。
  • 我不明白为什么 file.html 特别相关,因为如果从终端运行代码可以工作,但如果从 KM 或鸭嘴兽运行则不能。但如果它有很大的不同,类似文件的 url 是:url
  • 这很重要,因为如果文档不包含 &lt;td&gt;&lt;i class="blue"&gt; 或您的访问者错误,我们将浪费时间尝试提供帮助。您的系统上是否运行了多个 Ruby 实例?如果是这样,是否以您测试代码的各种方式启动了同一个实例?您在 Mac OS 上运行,它使用轻巧的方式将环境信息传递给应用程序,因此路径可能不同。
  • 我认为它不重要的原因是代码在从终端运行时有效,因此文件必须包含相关的访问器。我确实有多个 Ruby 实例,但我检查过 KM 和终端都运行相同版本的 Ruby 和 Nokogiri。
【解决方案2】:

我设法找出了 nokogiri 解析不起作用的原因。

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

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

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

nokogiri 正确解析文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-09
    相关资源
    最近更新 更多