【问题标题】:Why I get urllib2.HTTPError with urllib2 and no errors with urllib?为什么我用 urllib2 得到 urllib2.HTTPError 而 urllib 没有错误?
【发布时间】:2012-11-15 13:40:41
【问题描述】:

我有以下简单代码:

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

【问题讨论】:

    标签: python urllib2 urllib


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      维基百科似乎正在过滤掉 urllib2 的默认用户代理。改一下就好了。

      【讨论】:

        【解决方案3】:

        Overriding urllib2.HTTPError or urllib.error.HTTPError and reading response HTML anyway这篇文章展示了一些从服务器获取详细错误消息的好方法

        【讨论】:

          猜你喜欢
          • 2013-01-27
          • 2014-09-05
          • 1970-01-01
          • 2010-12-29
          • 2012-07-12
          • 1970-01-01
          • 2016-03-11
          • 1970-01-01
          相关资源
          最近更新 更多