Обычно это не проблема с клиентской стороны. Ваш код соответствует поведению, но ответ сервера может отличаться.
Я побежал код несколько раз, и это делает бросить некоторые вопросы:
>>> jsonurl = urlopen('http://www.reddit.com/r/funny/hot.json?limit=16')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 126, in urlopen
return _opener.open(url, data, timeout)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 406, in open
response = meth(req, response)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 519, in http_response
'http', request, response, code, msg, hdrs)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 444, in error
return self._call_chain(*args)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 378, in _call_chain
result = func(*args)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 527, in http_error_default
raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 429: Unknown
Вы должны обрабатывать случаи, когда ответ сервера ничего, кроме HTTP 200. Вы можете обернуть свой код в try
/except
и вы должны передать jsonurl
в json.loads() только тогда, когда ваш запрос будет успешным.
Также urlopen возвращает файловый дескриптор. Следовательно, если вы print jsourl
, он просто обеспечивает значение jsonurl.__repr__()
. Смотрите ниже:
>>> jsonurl.__repr__()
'<addinfourl at 4393153672 whose fp = <socket._fileobject object at 0x105978450>>'
Вы должны обратить внимание на следующее ::
>>> jsonurl.getcode()
200
>>>
и только если это 200, вы должны обрабатывать данные, полученные из запроса.
Спасибо, этот отзыв был очень информативным и полезным! – GangstaGraham