Обработка rss-перенаправлений с помощью Python/urllib2

Вызов urrlib2.urlopen по ссылке на статью, полученную из RSS-канала, приводит к следующей ошибке:

urllib2.HTTPError: ошибка HTTP 301: HTTP-сервер возвратил перенаправление ошибка tha t приведет к бесконечному циклу. Последнее сообщение об ошибке 30x был: перемещен навсегда

Согласно документации, urllib2 поддерживает перенаправления.

На Java проблема была решена путем вызова

HttpURLConnection.setFollowRedirects(true);

Как я могу решить эту проблему с помощью Python?

UPDATE

У меня возникают проблемы с:

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

Ответы

Ответ 1

Оказывается, вам нужно включить Cookies. Страница перенаправляет себя после установки файла cookie. Поскольку urllib2 не обрабатывает файлы cookie по умолчанию, вы должны сделать это самостоятельно.

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()

Ответ 2

Ничего плохого в решении @sleeplessnerd, но это очень, очень немного элегантно:

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

print p.read()

Фактически, если вы посмотрите на встроенную документацию для функции CookieJar(), она более или менее сообщит вам сделать так:

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