2012-03-29 73 views
14

Calling urrlib2.urlopen en un enlace a un artículo obtienen de una fuente RSS conduce al error siguiente:RSS Manejo de redirecciones 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

Según la documentación, urllib2 apoya redirecciones.

En Java se solucionó el problema con sólo llamar

HttpURLConnection.setFollowRedirects(true);

¿Cómo puedo solucionarlo con Python?

ACTUALIZACIÓN

El enlace Estoy teniendo problemas con:

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

+0

redirecciones son de forma predeterminada. Lee el mensaje de error nuevamente. Para determinar si esto es un error en el std-lib, debe proporcionar la URL para su verificación. Tenga en cuenta que también el servidor puede devolver cosas diferentes según el User-Agent enviado. – sleeplessnerd

+0

He agregado la url. Parece que hay más de 5 redirecciones. Pero Java los soluciona sin ningún material adicional como agente de usuario. – Alex

+0

Posible duplicado de [Python urllib2.urlopen que devuelve el error 302 aunque la página exista] (http://stackoverflow.com/questions/4098702/python-urllib2-urlopen-returning-302-error-even-though-page-exists) – Krastanov

Respuesta

25

Resulta que necesita habilitar las cookies. La página se redirige a sí misma después de establecer una cookie primero. Debido a que urllib2 no maneja las cookies de forma predeterminada, debes hacerlo tú mismo.

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

No hay nada malo con solución de @ sleeplessnerd, pero esto es muy, muy ligeramente más 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() 

De hecho, si nos fijamos en la documentación en línea para la función CookieJar(), que más o -menos te dice que hacer las cosas de esta manera:

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

+0

Si se implementa de esta manera, ¿se comparte el cookiejar entre las solicitudes posteriores? (¿HTTPCookieProcessor usa un singleton-cache para las cookies, o un nuevo jar de cookies cada vez?) – owenfi