2017-05-29 3 views
0

Ich benutze urllib.request-Paket, um Webseiten zu öffnen und zu lesen. Ich möchte sicherstellen, dass mein Code Weiterleitungen gut verarbeitet. Im Moment versage ich nur, wenn ich eine Umleitung sehe (es ist ein HTTPError). Kann mir jemand sagen, wie ich damit umgehen soll? Mein Code sieht derzeit so aus:Umleitungs-Handler Python 3.4.3

try: 
     text = str(urllib.request.urlopen(url, timeout=10).read()) 
except ValueError as error: 
     print(error) 
except urllib.error.HTTPError as error: 
     print(error) 
except urllib.error.URLError as error: 
     print(error) 
except timeout as error: 
     print(error) 

Bitte helfen Sie mir, ich bin neu zu diesem Thema. Vielen Dank!

+0

das Verhalten Beschreiben Sie möchten, um zu sehen, wenn es eine ist umleiten. –

+0

Ich möchte es statt zu versagen, auf die umgeleitete Seite gehen und diese Webseite lesen. Leitet insbesondere von http zu https auf die gleiche Seite um. – anon

Antwort

0

Mit requests Paket konnte ich eine bessere Lösung finden. Mit der einzigen Ausnahme, müssen Sie behandeln sind:

try: 
     r = requests.get(url, timeout =5) 

except requests.exceptions.Timeout: 
# Maybe set up for a retry, or continue in a retry loop 

except requests.exceptions.TooManyRedirects as error: 
# Tell the user their URL was bad and try a different one 

except requests.exceptions.ConnectionError: 
# Connection could not be completed 

except requests.exceptions.RequestException as e: 
# catastrophic error. bail. 

Und den Text dieser Seite zu bekommen, alles, was Sie tun müssen, ist: r.text

0

Ich verwende spezielle URLopener Umleitungen zu fangen:

import urllib 

class RedirectException(Exception): 
    def __init__(self, errcode, newurl): 
     Exception.__init__(self) 
     self.errcode = errcode 
     self.newurl = newurl 

class MyURLopener(urllib.URLopener): 
    # Error 301 -- relocated (permanently) 
    def http_error_301(self, url, fp, errcode, errmsg, headers, data=None): 
     if headers.has_key('location'): 
      newurl = headers['location'] 
     elif headers.has_key('uri'): 
      newurl = headers['uri'] 
     else: 
      newurl = "Nowhere" 
     raise RedirectException(errcode, newurl) 

    # Error 302 -- relocated (temporarily) 
    http_error_302 = http_error_301 
    # Error 303 -- relocated (see other) 
    http_error_303 = http_error_301 
    # Error 307 -- relocated (temporarily) 
    http_error_307 = http_error_301 

urllib._urlopener = MyURLopener() 

Jetzt brauche ich RedirectException und voila zu fangen - ich weiß, es war eine Umleitung und ich kenne die URL. Warnung - Ich benutze den Code mit Python 2.7, weiß nicht, ob es mit Python 3 funktioniert.

+0

Das scheint nicht für Python 3 zu funktionieren ... danke für die Antwort – anon

Verwandte Themen