我有以下简单的代码:
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)
此代码生成以下错误消息:
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
但如果我用urllib替换urllib2,我就不会收到任何错误消息。任何人都可以解释这种行为吗?
答案 0 :(得分:10)
原始urllib
根本不会在403代码上引发异常。如果您将print c.getcode()
添加到程序的最后一行,urllib
将会到达该程序并仍然打印出403。
然后,如果你最后做print c.read()
,你会发现你确实从维基百科那里得到了一个错误页面。这只是urllib2
决定将错误403视为运行时异常的问题,而urllib
则允许您仍然收到错误403,然后对该页面执行某些操作。
答案 1 :(得分:4)
维基百科似乎正在过滤掉urllib2的默认用户代理。只需改变它。
答案 2 :(得分:0)
Overriding urllib2.HTTPError or urllib.error.HTTPError and reading response HTML anyway这篇文章展示了从服务器
获取详细错误消息的一些好方法