2012-03-29 19 views
14

Wywołanie urrlib2.urlopen na link do artykułu pobranego z kanału RSS prowadzi do następującego błędu:Handling rss przekierowania z 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

Zgodnie z dokumentacją, urllib2 obsługuje przekierowania.

na Java problem został rozwiązany po prostu dzwoniąc

HttpURLConnection.setFollowRedirects(true);

Jak mogę rozwiązać go z Pythona?

UPDATE

Link Mam problemy z:

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

+0

przekierowania są domyślnie włączone. Przeczytaj ponownie komunikat o błędzie. Aby ustalić, czy jest to błąd w std-lib, musisz podać adres URL do sprawdzenia. Zwróć uwagę, że również serwer mógł zwrócić różne rzeczy na podstawie wysłanego User-Agenta. – sleeplessnerd

+0

Dodałem adres URL. Wygląda na to, że jest więcej niż 5 przekierowań. Ale Java radzi sobie z nimi bez żadnych dodatkowych rzeczy, takich jak agent użytkownika. – Alex

+0

Prawdopodobny duplikat [Python urllib2.urlopen zwracający błąd 302 mimo istnienia strony] (http://stackoverflow.com/questions/4098702/python-urllib2-urlopen-returning-302-error-even-though-page-istists) – Krastanov

Odpowiedz

25

Okazuje się, musisz włączyć obsługę Cookies. Strona przekierowuje do siebie po uprzednim ustawieniu pliku cookie. Ponieważ urllib2 nie obsługuje plików cookie domyślnie, musisz to zrobić samodzielnie.

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

Nic złego roztworem @ sleeplessnerd, ale to jest bardzo, bardzo nieznacznie bardziej eleganckie:

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

W rzeczywistości, jeśli spojrzeć na dokumentacji inline dla funkcji CookieJar(), to bardziej lub nie- każe ci robić rzeczy w ten sposób:

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

+0

Jeśli zaimplementowano w ten sposób, to cookiejar jest dzielony pomiędzy kolejnymi żądaniami? (Czy za każdym razem HTTPCookieProcessor używa pojedynczej pamięci podręcznej dla plików cookie lub nowego pliku cookie?) – owenfi