为什么使用urllib2会出现HTTPError,而使用urllib却没有错误?
我有以下这段简单的代码:
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
但是如果我把urllib2换成urllib,就不会出现错误信息。有人能解释一下这是为什么吗?
3 个回答
0
覆盖 urllib2.HTTPError 或 urllib.error.HTTPError 并且仍然读取响应的 HTML 这篇文章展示了一些很好的方法,可以从服务器获取详细的错误信息。
4
维基百科似乎在屏蔽urllib2的默认用户代理。只需要更改一下就可以了。
10
原来的 urllib
在遇到403错误时不会抛出异常。也就是说,如果你在程序的最后一行加上 print c.getcode()
,那么 urllib
还是会执行到这行,并且打印出403。
接着,如果你在最后加上 print c.read()
,你会发现其实你确实收到了来自维基百科的错误页面。这里的关键在于 urllib2
选择把403错误当作运行时异常来处理,而 urllib
则允许你获取到403错误后,继续对这个页面进行操作。