Pergunta

Eu tenho o seguinte código simples:

import urllib2
import sys
sys.path.append('../BeautifulSoup/BeautifulSoup-3.1.0.1')
from BeautifulSoup import *
page='http://en.wikipedia.org/wiki/Main_Page'
c=urllib2.urlopen(page)

Este código gera as seguintes mensagens de erro:

    c=urllib2.urlopen(page)
  File "/usr/lib64/python2.4/urllib2.py", line 130, in urlopen
    return _opener.open(url, data)
  File "/usr/lib64/python2.4/urllib2.py", line 364, in open
    response = meth(req, response)
  File "/usr/lib64/python2.4/urllib2.py", line 471, in http_response
    response = self.parent.error(
  File "/usr/lib64/python2.4/urllib2.py", line 402, in error
    return self._call_chain(*args)
  File "/usr/lib64/python2.4/urllib2.py", line 337, in _call_chain
    result = func(*args)
  File "/usr/lib64/python2.4/urllib2.py", line 480, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 403: Forbidden

Mas se eu substituir o Urllib2 pelo urllib, não recebo mensagens de erro. Alguém pode explicar esse comportamento?

Foi útil?

Solução

O original urllib Simplesmente não levanta uma exceção em um código 403. Se você adicionar print c.getcode() para a última linha do seu programa, urllib chegará a ele e ainda imprimirá 403.

Então se você fizer print c.read() No final, você verá que realmente recebeu uma página de erro da Wikipedia. É apenas uma questão de urllib2 Decidindo tratar um erro 403 como uma exceção de tempo de execução, versus urllib permitindo que você ainda receba um erro 403 e faça algo com a página.

Outras dicas

A Wikipedia parece estar filtrando o agente de usuário padrão do Urllib2. Apenas mude.

Substituindo urllib2.httperror ou urllib.error.httperror e lendo resposta html de qualquer maneira Esta postagem mostra uma boa maneira de obter uma mensagem de erro detalhada do servidor

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