Net :: HTTP и Nokogiri - неопределенный метод body для nil: NilClass (NoMethodError) - PullRequest
0 голосов
/ 18 марта 2019

Спасибо за ваше время.Несколько новичок в ООП и 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, чтобы увидеть, если это такноль.Любая помощь приветствуется, спасибо заранее.

...