Open-URI удобен, но эта простота использования означает, что он удаляет доступ ко многим деталям конфигурации, которые позволяют другие клиенты HTTP, такие как Net :: HTTP.
Это зависит от того, какая версияRuby вы используете.Для 1.8.7 вы можете использовать модуль Timeout .Из документов:
require 'timeout'
begin
status = Timeout::timeout(5) {
getresult = open(cstr, "UserAgent" => "Ruby-OpenURI").read
}
rescue Timeout::Error => e
puts e.to_s
end
Затем проверьте длину getresult, чтобы увидеть, если вы получили какой-либо контент:
if (getresult.empty?)
puts "got nothing from url"
end
Если вы используете Ruby 1.9.2, вы можете добавить :read_timeout => 10
опция для метода open()
.
Кроме того, ваш код можно было бы сжать и сделать немного более гибким.Это позволит вам передать URL или использовать по умолчанию текущий используемый URL.Также прочитайте документы NodeSet от Nokogiri, чтобы понять разницу между xpath
, /
, css
и at
, %
, at_css
, at_xpath
:
def get_name_from_remote_url(cstr = 'http://someurl.com')
doc = Nokogiri::XML(open(cstr, 'UserAgent' => 'Ruby-OpenURI'))
# xpath returns a nodeset which has to be iterated over
# my_data = doc.xpath('/session/name').text # => 'Fred' or 'Sam' etc
# at returns a single node
doc.at('/session/name').text
end