2014-12-10 11 views
26

ho questo semplice parser HTML (a fini di apprendimento) che ho lavorato su .:Rubino open-uri reindirizzamento vietato

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 

e quando sono entrata http://twitter.com, ottengo questo messaggio di errore:

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

Qualche consiglio o aiuto? Sono nuovo di Ruby e sono a conoscenza di altri moduli di analisi html, ma sto facendo questo per imparare le basi di Ruby. Grazie.

+0

Credo che sta succedendo perché twitter usa 'https'. FWIW: potresti voler colpire un sito come "http: // www.example.org" invece di twitter se stai solo cercando di imparare e curiosare. – orde

+1

So che il sito web http: // funziona, ma ho pensato che open-uri automaticamente reindirizza a https, 'https: // twitter.com' funziona, ma http non funziona, ci sono soluzioni? – Vikaton

risposta

25

Dai un'occhiata alla gemma open_uri_redirections.

Applica Ruby's OpenURI per consentire il reindirizzamento da HTTP a HTTPS o viceversa.

12

È anche possibile rilevare l'eccezione, quindi riprovare con l'URL "https".

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 

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

+2

Questo ha funzionato, la gemma open_uri_redirections no. –

+2

Molto più elegante dell'aggiunta di un'altra dipendenza per gestirlo. – ACIDSTEALTH

+0

Brillante! Un frammento di sterling, proprio quello di cui avevo bisogno. –