urllib2.urlopen() против urllib.urlopen() - urllib2 выдает 404, в то время как urllib работает! ЗАЧЕМ?

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.


person Community    schedule 22.12.2009    source источник


Ответы (1)


Этот 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()
person Jonathan Feinberg    schedule 22.12.2009
comment
это полезно знать - из любопытства, когда я набираю этот URL-адрес в своем браузере, он также работает. Означает ли это, что браузер также получает ошибку 404, но просто отображает содержимое, как это делает urllib? - person ; 22.12.2009
comment
@ Джерри Да, вот что это значит. Вы можете проверить это с помощью Firebug или Safari/Chrome Web Inspector. - person Will McCutchen; 22.12.2009
comment
У меня есть firebug, и я проверил его, но не увидел ничего, что указывало бы на ошибку 404 — есть ли что-то особенное, что вам нужно сделать? Из нездорового любопытства, почему браузеры терпят такие плохие стандарты? Почему бы просто не указать, что файл не найден? Это какой-то трюк, который сайт использует, чтобы помешать ботам — вернуть 404 с контентом, зная, что браузер отобразит контент, и большинство ботов будут двигаться дальше? - person ; 22.12.2009
comment
Он возвращает 404, потому что, я думаю, у них есть ошибка на их веб-сайте. 404 может иметь любой контент, который вы пожелаете. Допустимый 404, например, может вернуть каталог сайта или результаты текстового поиска, связанные с введенным вами URL-адресом. Браузеры делают то, что должны делать. - person Jonathan Feinberg; 22.12.2009