2017-05-29 70 views
0

我使用urllib.request包來打開和讀取網頁。我想確保我的代碼很好地處理重定向。現在我只是在看到重定向時失敗(這是一個HTTPError)。有人可以指導我如何處理?我的代碼目前看起來像:重定向處理程序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) 

請幫我我是這個新手。謝謝!

+0

描述你希望看到有一個當行爲重定向。 –

+0

我希望它不會失敗,請轉到重定向頁面並閱讀該網頁。尤其是從http到https重定向到同一頁面。 – anon

回答

0

使用requests軟件包我找到了更好的解決方案。你需要處理的唯一的例外是:

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. 

而獲得該頁面的文本,所有你需要做的是: r.text

0

我使用特殊URLopener趕上重定向:

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

現在我需要趕上RedirectException,瞧 - 我知道有一個重定向,我知道的URL。警告 - 我使用Python 2.7的代碼,不知道它是否可以與Python 3一起使用。

+0

這似乎不適用於Python 3 ...感謝您的迴應,雖然 – anon

相關問題