Por que eu recebo urllib2.httperror com urllib2 e sem erros com urllib?
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?
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