为什么我用urllib2获取urllib2.HTTPError并且urllib没有错误?

时间:2009-09-26 19:46:37

标签: python urllib2 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

但如果我用urllib替换urllib2,我就不会收到任何错误消息。任何人都可以解释这种行为吗?

3 个答案:

答案 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这篇文章展示了从服务器

获取详细错误消息的一些好方法