urllib2.urlopen()与urllib.urlopen() - urllib2抛出404错误而urllib可以正常工作!为什么?

18
import urllib

print urllib.urlopen('http://www.reefgeek.com/equipment/Controllers_&_Monitors/Neptune_Systems_AquaController/Apex_Controller_&_Accessories/').read()

上述脚本工作并返回预期结果的同时:

import urllib2

print urllib2.urlopen('http://www.reefgeek.com/equipment/Controllers_&_Monitors/Neptune_Systems_AquaController/Apex_Controller_&_Accessories/').read()

抛出以下错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.5/urllib2.py", line 124, in urlopen
    return _opener.open(url, data)
  File "/usr/lib/python2.5/urllib2.py", line 387, in open
    response = meth(req, response)
  File "/usr/lib/python2.5/urllib2.py", line 498, in http_response
    'http', request, response, code, msg, hdrs)
  File "/usr/lib/python2.5/urllib2.py", line 425, in error
    return self._call_chain(*args)
  File "/usr/lib/python2.5/urllib2.py", line 360, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.5/urllib2.py", line 506, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 404: Not Found

有人知道为什么吗?我是在家用笔记本电脑通过家庭网络运行此代码,没有设置代理 - 直接从笔记本电脑连接到路由器,然后转到 www。

1个回答

35

确实,该URL确实导致404错误,但伴随着大量HTML内容。urllib2正在将其(正确地)处理为错误条件。您可以通过以下方式恢复该站点的404页面内容:

import urllib2
try:
    print urllib2.urlopen('http://www.reefgeek.com/equipment/Controllers_&_Monitors/Neptune_Systems_AquaController/Apex_Controller_&_Accessories/').read()
except urllib2.HTTPError, e:
    print e.code
    print e.msg
    print e.headers
    print e.fp.read()

2
很好知道 - 出于好奇,当我在浏览器中输入此URL时,它也可以工作。这是否意味着浏览器也收到了404但只是像urllib一样显示内容? - user236959
1
@Jerry 是的,这就是意思。你可以用Firebug或Safari/Chrome的Web Inspector来验证。 - Will McCutchen
我有Firebug并且已经检查过了,但是我没有看到任何指示404的东西 - 你需要做些特殊的事情吗?出于好奇,为什么浏览器容忍如此糟糕的标准?为什么不直接指出找不到文件呢?这是网站用来阻挠机器人的一种技巧吗 - 返回一个带有内容的404,知道浏览器会显示内容,大多数机器人会继续前进? - user236959
它返回404是因为他们的网站有一个错误,我想。一个404可以有任何你希望的内容。例如,一个合法的404可能会返回一个站点目录或与您输入的URL相关的文本搜索结果。浏览器正在执行它们应该执行的操作。 - Jonathan Feinberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接