Спасибо за ваше время.Несколько новичок в ООП и Ruby, и после того, как я синтезировал решения из нескольких разных ответов о переполнении стека, я обернулся.
Моя цель - написать скрипт, который анализирует CSV URL-адресов с использованием библиотеки Nokogiri.После попытки не использовать open-uri и плагин open-uri-redirections для отслеживания перенаправлений, я остановился на Net :: HTTP, и это заставило меня двигаться ... пока я не столкнулся с URL-адресами, которые имеютПеренаправление 302. В частности,
Вот метод, который я использую для привлечения URL:
require 'Nokogiri'
require 'Net/http'
require 'csv'
def fetch(uri_str, limit = 10)
# You should choose better exception.
raise ArgumentError, 'HTTP redirect too deep' if limit == 0
url = URI.parse(uri_str)
#puts "The value of uri_str is: #{ uri_str}"
#puts "The value of URI.parse(uri_str) is #{ url }"
req = Net::HTTP::Get.new(url.path, { 'User-Agent' => 'Mozilla/5.0 (etc...)' })
# puts "THE URL IS #{url.scheme + ":" + url.host + url.path}" # just a reporter so I can see if it's mangled
response = Net::HTTP.start(url.host, url.port, :use_ssl => url.scheme == 'https') { |http| http.request(req) }
case response
when Net::HTTPSuccess then response
when Net::HTTPRedirection then fetch(response['location'], limit - 1)
else
#puts "Problem clause!"
response.error!
end
end
Далее в моем сценарии я беру ARGV с именем файла csv URL, делаю CSV.read, закодируйте URL в строку, затем используйте Nokogiri :: HTML.parse, чтобы превратить все это во что-то, что я могу использовать селекторы xpath для проверки, а затем записи в выходной файл CSV.
Работает прекрасно ... так долгокак я встречаю 200 ответ, который, к сожалению, не каждый веб-сайт.Когда я сталкиваюсь с 302, я получаю это:
C:/Ruby24-x64/lib/ruby/2.4.0/Net/http.rb:1570:in `addr_port': undefined method `+' for nil:NilClass (NoMethodError)
from C:/Ruby24-x64/lib/ruby/2.4.0/Net/http.rb:1503:in `begin_transport'
from C:/Ruby24-x64/lib/ruby/2.4.0/Net/http.rb:1442:in `transport_request'
from C:/Ruby24-x64/lib/ruby/2.4.0/Net/http.rb:1416:in `request'
from httpcsv.rb:14:in `block in fetch'
from C:/Ruby24-x64/lib/ruby/2.4.0/Net/http.rb:877:in `start'
from C:/Ruby24-x64/lib/ruby/2.4.0/Net/http.rb:608:in `start'
from httpcsv.rb:14:in `fetch'
from httpcsv.rb:17:in `fetch'
from httpcsv.rb:42:in `block in <main>'
from C:/Ruby24-x64/lib/ruby/2.4.0/csv.rb:866:in `each'
from C:/Ruby24-x64/lib/ruby/2.4.0/csv.rb:866:in `each'
from httpcsv.rb:38:in `<main>'
Я знаю, что что-то упускаю прямо перед собой, но я не могу сказать, что мне нужно puts
, чтобы увидеть, если это такноль.Любая помощь приветствуется, спасибо заранее.