Substituindo urllib2.HTTPError ou urllib.error.HTTPError e ler HTML de resposta de qualquer maneira

StackOverflow https://stackoverflow.com/questions/2233687

Pergunta

Eu recebo um 'Erro HTTP 500: Erro de servidor interno'. Resposta, mas eu ainda quero ler os dados dentro do HTML de erro

Com Python 2.6, eu normalmente buscar uma página usando:

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

Ao tentar usar isso na URL não, fico com a urllib2.HTTPError exceção:

urllib2.HTTPError: HTTP Error 500: Internal Server Error

Como posso obter tais páginas de erro (com ou sem urllib2), todos enquanto eles estão retornando erros de servidor interno?

Note-se que com o Python 3, à excepção correspondente é urllib.error.HTTPError.

Foi útil?

Solução

O HTTPError é um arquivo-como objeto . Você pode pegá-lo e, em seguida, read seu conteúdo.

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

Outras dicas

Se você quer dizer que você quer ler o corpo do 500:

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

No seu caso, você não precisa para construir o pedido. Basta fazer

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

Assim, você não substituir urllib2.HTTPError, você só tratar a exceção.

alist=['http://someurl.com']

def testUrl():
    errList=[]
    for URL in alist:
        try:
            urllib2.urlopen(URL)
        except urllib2.URLError, err:
            (err.reason != 200)
            errList.append(URL+" "+str(err.reason))
            return URL+" "+str(err.reason)
    return "".join(errList)

testUrl()
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top