2012-03-29 10 views
14

Calling urrlib2.urlopen su un link a un articolo inverosimile da un feed RSS conduce alla seguente errore:Handling rss reindirizza con Python/urllib2

urllib2.HTTPError: HTTP Error 301: The HTTP server returned a redirect error tha t would lead to an infinite loop. The last 30x error message was: Moved Permanently

Secondo la documentazione, urllib2 supporta reindirizzamenti.

su Java il problema è stato risolto da solo chiamando

HttpURLConnection.setFollowRedirects(true);

Come posso risolverlo con Python?

UPDATE

Il link Sto avendo problemi con:

http://feeds.nytimes.com/click.phdo?i=8cd5af579b320b0bfd695ddcc344d96c

+0

redirect sono di default. Leggi di nuovo il messaggio di errore. Per determinare se questo è un errore nello std-lib, devi fornire l'URL, per il controllo. Si noti che anche il server può restituire materiali diversi in base all'agente utente inviato. – sleeplessnerd

+0

Ho aggiunto l'URL. Sembra che ci siano più di 5 reindirizzamenti. Ma Java si affida a loro senza cose extra come user agent. – Alex

+0

Possibile duplicato di [Python urllib2.urlopen che restituisce 302 errori anche se la pagina esiste] (http://stackoverflow.com/questions/4098702/python-urllib2-urlopen-returning-302-error-even-though-page-exists) – Krastanov

risposta

25

scopre che devi abilitare i cookie. La pagina si reindirizza a se stessa dopo aver impostato prima un cookie. Poiché urllib2 non gestisce i cookie per impostazione predefinita, devi farlo tu stesso.

import urllib2 
import urllib 
from cookielib import CookieJar 

cj = CookieJar() 
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) 
p = opener.open("http://feeds.nytimes.com/click.phdo?i=8cd5af579b320b0bfd695ddcc344d96c") 

print p.read() 
9

Niente di male con la soluzione @ di sleeplessnerd, ma questo è molto, molto leggermente più elegante:

import urllib2 
url = "http://stackoverflow.com/questions/9926023/handling-rss-redirects-with-python-urllib2" 
p = urllib2.build_opener(urllib2.HTTPCookieProcessor).open(url) 

print p.read() 

In realtà, se si guarda la documentazione in linea per la funzione CookieJar(), è più o -less vi dice di fare le cose in questo modo:

You may not need to know about this class: try urllib2.build_opener(HTTPCookieProcessor).open(url)

+0

Se implementato in questo modo è il cookiejar condiviso tra le richieste successive? (HTTPCookieProcessor utilizza una cache singleton per i cookie o una nuova cookie jar ogni volta?) – owenfi