2014-12-10 5 views
26

Ich habe diesen einfachen HTML-Parser (zu Lernzwecken), die ich gearbeitet .:Ruby-open-uri Umleitung verboten

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 

und wenn ich Eingang http://twitter.com, erhalte ich diese Fehlermeldung:

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>' 

Irgendwelche Ratschläge oder Hilfe? Ich bin neu in Ruby und ich kenne andere HTML-Parsing-Module, aber ich mache das, um Ruby-Grundlagen zu lernen. Vielen Dank.

+0

Ich glaube, dass passiert, weil twitter verwendet 'https'. FWIW - Sie möchten vielleicht eine Website wie "http: // www.example.org" anstelle von Twitter aufrufen, wenn Sie nur lernen und stöbern möchten. – orde

+1

Ich weiß 'http: //' Website funktioniert, aber ich dachte, open-Uri automatisch auf https, 'https: // twitter.com' funktioniert, aber http nicht, gibt es irgendwelche Lösungen? – Vikaton

Antwort

25

Werfen Sie einen Blick auf die open_uri_redirections gem.

Es patches Ruby OpenURI um Umleitungen von HTTP zu HTTPS oder umgekehrt zu ermöglichen.

12

Sie können auch die Ausnahme abfangen und dann versuchen Sie es erneut mit "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 

Quelle: https://twin.github.io/improving-open-uri/

+2

Das funktionierte, das Juwel von open_uri_redirections nicht. –

+2

Viel eleganter als eine weitere Abhängigkeit hinzufügen, um damit umzugehen. – ACIDSTEALTH

+0

Brilliant! Ein Sterlingschnipsel, genau was ich brauchte. –