6

我有以下简单的代码:

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,我不会收到任何错误消息。任何人都可以解释这种行为吗?

4

3 回答 3

10

原版urllib根本不会在 403 代码上引发异常。如果您添加print c.getcode()到程序的最后一行,urllib将到达它并仍然打印出 403。

然后,如果你print c.read()最后这样做,你会看到你确实从 Wikipedia 获得了一个错误页面。这只是urllib2决定将错误 403 视为运行时异常的问题,而不是urllib允许您仍然收到错误 403 然后对页面执行某些操作。

于 2009-09-26T19:55:21.663 回答
4

维基百科似乎正在过滤掉 urllib2 的默认用户代理。改变它。

于 2009-09-26T19:52:40.017 回答
0

覆盖 urllib2.HTTPError 或 urllib.error.HTTPError 并无论如何读取响应 HTML这篇文章展示了一些从服务器获取详细错误消息的好方法

于 2011-02-26T08:08:56.060 回答