web-dev-qa-db-fra.com

Remplacer urllib2.HTTPError ou urllib.error.HTTPError et lire le code HTML de réponse de toute façon

Je reçois une réponse "HTTP Error 500: Internal Server Error", mais je souhaite toujours lire les données dans le code d'erreur HTML.

Avec Python 2.6, je récupère normalement une page en utilisant:

import urllib2
url = "http://google.com"
data = urllib2.urlopen(url)
data = data.read()

Lorsque j'essaie de l'utiliser sur l'URL défaillante, j'obtiens l'exception urllib2.HTTPError:

urllib2.HTTPError: HTTP Error 500: Internal Server Error

Comment puis-je récupérer ces pages d'erreur (avec ou sans urllib2), tout en renvoyant des erreurs de serveur internes?

Notez qu'avec Python 3, l'exception correspondante est urllib.error.HTTPError.

72
Backus

HTTPErrorest un objet de type fichier . Vous pouvez l'attraper puis read son contenu.

try:
    resp = urllib2.urlopen(url)
    contents = resp.read()
except urllib2.HTTPError, error:
    contents = error.read()
135
Joe Holloway

Si vous voulez lire le corps du 500:

request = urllib2.Request(url, data, headers)
try:
        resp = urllib2.urlopen(request)
        print resp.read()
except urllib2.HTTPError, error:
        print "ERROR: ", error.read()

Dans votre cas, vous n'avez pas besoin de créer la demande. Fais juste

try:
        resp = urllib2.urlopen(url)
        print resp.read()
except urllib2.HTTPError, error:
        print "ERROR: ", error.read()

ainsi, vous ne remplacez pas urllib2.HTTPError, vous gérez simplement l'exception.

9
sberry