为什么使用urllib2会出现HTTPError,而使用urllib却没有错误?

6 投票
3 回答
9104 浏览
提问于 2025-04-15 14:37

我有以下这段简单的代码:

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错误后,继续对这个页面进行操作。

撰写回答