ruby не выполняется из терминала правильно
У меня есть следующий скрипт 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 ответа
Мне удалось выяснить, почему анализ nokogiri не работает.
По какой-то причине, если страница была открыта из Интернета, скрипт работал бы, но если веб-страница была сначала сохранена на диск, а затем открыта, это не так. Я обнаружил, что когда страница была открыта с диска, она обнаружила ошибку nokogiri и только прочитала и проанализировала первые несколько строк файла. Ошибка произошла из-за того, что html-комментарий был закрыт не на той же строке, а на следующей.
Мне удалось преодолеть эту проблему, прочитав файл с режимом "rb" вместо просто "r". т.е. если я заменю строку file.open на:
page=File.open("file.html","rb"){|file| file.read}
нокогири правильно разбирает файл.
Если ваш код не может прочитать файл, 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')
проверить, есть ли в нем содержимое, прежде чем продолжить.