2012-07-01 4 views
0

Я пытаюсь использовать обертку API, загруженную из сети, чтобы получить результаты от нового azure Bing API. Я пытаюсь реализовать его в соответствии с инструкциями, но получаю сообщение об ошибке выполнения:Объект nonetype не имеет атрибута '__getitem__'

Traceback (most recent call last): 
    File "bingwrapper.py", line 4, in <module> 
    bingsearch.request("affirmative action") 
    File "/usr/local/lib/python2.7/dist-packages/bingsearch-0.1-py2.7.egg/bingsearch.py", line 8, in request 
    return r.json['d']['results'] 
TypeError: 'NoneType' object has no attribute '__getitem__' 

Это код обертка:

import requests 

URL = 'https://api.datamarket.azure.com/Data.ashx/Bing/SearchWeb/Web?Query=%(query)s&$top=50&$format=json' 
API_KEY = 'SECRET_API_KEY' 

def request(query, **params): 
    r = requests.get(URL % {'query': query}, auth=('', API_KEY)) 
    return r.json['d']['results'] 

Инструкции:

>>> import bingsearch 
>>> bingsearch.API_KEY='Your-Api-Key-Here' 
>>> r = bingsearch.request("Python Software Foundation") 
>>> r.status_code 
200 
>>> r[0]['Description'] 
u'Python Software Foundation Home Page. The mission of the Python Software Foundation is to promote, protect, and advance the Python programming language, and to ...' 
>>> r[0]['Url'] 
u'http://www.python.org/psf/ 

Это мой код, который использует обертку (в соответствии с инструкциями):

import bingsearch 
bingsearch.API_KEY='abcdefghijklmnopqrstuv' 
r = bingsearch.request("affirmative+action") 
+0

Не могли бы вы предоставить полную трассировку, а не только ошибку? –

+0

@isbadawi предоставил полную трассу – adohertyd

+0

Каково содержимое 'r' в оболочке? –

ответ

1

Я сам это испытал, и кажется, что вам не хватает правильного url-encode вашего запроса. Без этого я получал код 400.

import urllib2 
import requests 

# note the single quotes surrounding the query 
URL = "https://api.datamarket.azure.com/Data.ashx/Bing/SearchWeb/Web?Query='%(query)s'&$top=50&$format=json" 

query = 'affirmative+action' 

# query == 'affirmative%2Baction' 
r = requests.get(URL % {'query': urllib2.quote(query)}, auth=('', API_KEY)) 
print r.json['d']['results'] 

Ваш пример не имеет особого смысла, потому что ваш request обертка возвращает list результатов, но в основной пример использования вы вызываете его, а затем проверить атрибут status_code на возвращаемое значение (которое является список). Этот атрибут будет присутствовать в объектах ответа, но вы не вернете его из своей оболочки.

Смежные вопросы