I have this simple html parser(for learning purposes) that I have been working on.:
require 'open-uri'
puts "Enter URL to parse HTML: "
url = gets.chomp
puts "Enter tag to parse from: "
tag = gets.chomp
response = open(url).read
title1 = response.index(tag)
title2 = response.index(tag.insert(1,'/')) -1
result = response[(title1 + tag.length - 1)..title2]
print result
and when I input http://twitter.com
, I get this error message:
ERROR: `open_loop': redirection forbidden: http://twitter.com -> https://twitter.com/ (RuntimeError)
from /usr/local/rvm/rubies/ruby-2.1.4/lib/ruby/2.1.0/open-uri.rb:149:in `open_uri'
from /usr/local/rvm/rubies/ruby-2.1.4/lib/ruby/2.1.0/open-uri.rb:704:in `open'
from /usr/local/rvm/rubies/ruby-2.1.4/lib/ruby/2.1.0/open-uri.rb:34:in `open'
from /home/ubuntu/workspace/htmlparse.rb:6:in `<main>'
Any advise or help? Im new to Ruby and I am aware of other html parsing modules, but Im doing this to learn Ruby basics. Thanks.
Have a look at the open_uri_redirections gem.
It patches Ruby's OpenURI to allow redirections from HTTP to HTTPS or the other way around.
kayn
You can also catch the exception and then try it again with 'https' url.
url = "http://classic.ona.io/api/v1/files/3538545?filename=gringgo/attachments/1485229166168.jpg"
uri = URI.parse(url)
tries = 3
begin
uri.open(redirect: false)
rescue OpenURI::HTTPRedirect => redirect
uri = redirect.uri # assigned from the "Location" response header
retry if (tries -= 1) > 0
raise
end
Ruby 2.4 fixed upgrade redirects (from http -> https) in open-uri
, so now:
RUBY_VERSION
=> "2.4.2"
require 'open-uri'
=> true
open('http://twitter.com')
=> #<Tempfile:/tmp/open-uri20170926-24254-1kflwxq>
Source: http://blog.bigbinary.com/2017/03/02/open-uri-in-ruby-2-4-allows-http-to-https-redirection.html
来源:https://stackoverflow.com/questions/27407938/ruby-open-uri-redirect-forbidden