2010-03-01 19 views
5

Je courais pour OpenURI::HTTPError: 403 Forbidden erreur lorsque je tente de open une URL avec une virgule (ou d'autres caractères spéciaux comme .). Je suis capable d'ouvrir la même URL dans un navigateur.Ouverture d'une URL WIKI par une virgule en utilisant `open-uri`

require 'open-uri' 
url = "http://en.wikipedia.org/wiki/Thor_Industries,_Inc." 
f = open(url) 
# throws OpenURI::HTTPError: 403 Forbidden error 

Comment puis-je échapper une telle URL?

J'ai essayé d'échapper l'URL avec CGI::escape et j'obtiens la même erreur.

f = open(CGI::escape(url)) 

Répondre

7

En règle générale, on pourrait simplement exiger le module cgi, puis utilisez CGI::escape(str).

require 'cgi' 
require 'open-uri' 
escaped_page = CGI::escape("Thor_Industries,_Inc.") 
url = "http://en.wikipedia.org/wiki/#{escaped_page}" 
f = open(url) 

Cependant, cela ne semble pas fonctionner pour votre cas particulier, et retourne encore 403. Je vais laisser ce ici pour référence, quel que soit.


Edit: Wikipédia refuse vos demandes car il soupçonne que vous êtes un bot. Il semblerait que certaines pages qui sont clairement le contenu vous sont accordées, mais ceux qui ne correspondent pas à son modèle «sûr» (par exemple ceux qui contiennent des points ou des virgules) sont soumis à son filtrage. Si vous avez réellement sortie le contenu (je l'ai fait avec Net::HTTP), vous obtenez les éléments suivants:

scripts doivent utiliser une chaîne Agent utilisateur informatif avec des informations de contact, ou ils peuvent être bloqués par IP sans préavis.

Fournir une chaîne de l'agent utilisateur, cependant, résout le problème:

open("http://en.wikipedia.org/wiki/Thor_Industries,_Inc.", 
    "User-Agent" => "Ruby/#{RUBY_VERSION}") 
+0

Bien que, le tester, je reçois aussi un 403. Je vais continuer d'y travailler ... – Matchu

+0

I avait essayé 'CGI :: escape' avec des résultats similaires. J'ai oublié de l'ajouter à ma question. –

+0

Vous pourriez vouloir voir quelle sortie vous obtenez. Je me souviens il y a quelques semaines que Wikipedia a commencé à me donner des erreurs 403 lors de demandes de Ruby parce que je ne fournissais aucune chaîne user-agent, et la sortie l'a dit. – Matchu