2013-11-17 4 views
1

Я пытаюсь вытащить все значения DisplayUrl из JSON, возвращенные Bing API. Я не уверен, что я делаю неправильно. Любое понимание оценено!Итерация над словарями JSON (Bing API)

search_response = urllib2.urlopen(request) 
search_results = search_response.read() 
results = json.loads(search_results) 
for item in results.get(u'Web', []): 
    print item.get(u'DisplayUrl') 

Мой запрос настроен вернуть два результата, так что я ищу, чтобы получить два отпечатка с ключа DisplayUrl.

Принимаемый results:

{ 
    u'd': { 
     u'results': [ 
      { 
       u'Web': [ 
        { 
         u'Description': u'Test.comprovidesacompletesoftwaresolutionforcreatingonlinetestsandmanagingenterpriseandspecialistcertificationprograms, 
         inupto22languages.', 
         u'Title': u'Test', 
         u'Url': u'http: //www.test.com/', 
         u'__metadata': { 
          u'type': u'WebResult', 
          u'uri': u"https://api.datamarket.azure.com/Data.ashx/Bing/Search/v1/ExpandableSearchResultSet(guid'51264a7c-1d14-44a2-bbcc-afa43e7fac29')/Web?$skip=0&$top=1" 
         }, 
         u'DisplayUrl': u'www.test.com', 
         u'ID': u'6987b446-c20a-4521-a998-f7cf62cff0aa' 
        }, 
        { 
         u'Description': u"Test your Internet Connection with Speakeasy's reliable and accurate broadband speed test. What's your speed?", 
         u'Title': u'SpeakeasySpeedTest-MegaPath', 
         u'Url': u'http: //www.speakeasy.net/speedtest/', 
         u'__metadata': { 
          u'type': u'WebResult', 
          u'uri': u"https://api.datamarket.azure.com/Data.ashx/Bing/Search/v1/ExpandableSearchResultSet(guid'51264a7c-1d14-44a2-bbcc-afa43e7fac29')/Web?$skip=1&$top=1" 
         }, 
         u'DisplayUrl': u'www.speakeasy.net/speedtest', 
         u'ID': u'b2cab0a5-9866-481b-86aa-1621616ca9c9' 
        } 
       ], 
       u'VideoTotal': u'', 
       u'RelatedSearch': [ 

       ], 
       u'Image': [ 

       ], 
       u'__metadata': { 
        u'type': u'ExpandableSearchResult', 
        u'uri': u"https://api.datamarket.azure.com/Data.ashx/Bing/Search/v1/Composite?Sources='web'&Query='test.com'&$skip=0&$top=1" 
       }, 
       u'ImageOffset': u'', 
       u'AlterationOverrideQuery': u'', 
       u'ImageTotal': u'', 
       u'WebTotal': u'707000000', 
       u'SpellingSuggestionsTotal': u'', 
       u'WebOffset': u'0', 
       u'Video': [ 

       ], 
       u'News': [ 

       ], 
       u'AlteredQuery': u'', 
       u'SpellingSuggestions': [ 

       ], 
       u'VideoOffset': u'', 
       u'NewsTotal': u'', 
       u'ID': u'51264a7c-1d14-44a2-bbcc-afa43e7fac29', 
       u'NewsOffset': u'' 
      } 
     ] 
    } 
} 

ответ

1

Вы внешнюю обертку, чтобы пройти здесь; Ваш results объект представляет собой словарь с одним ключевым 'd', ссылаясь значение словаря, который имеет 'results' ключ, и это список словарей и там мы находим словарь с 'Web' ключом, наконец:

for result in results['d']['results']: 
    for item in result.get('Web', []): 
     print item.get(u'DisplayUrl') 

Демонстрация:

>>> for result in results['d']['results']: 
...  for item in result.get('Web', []): 
...   print item.get(u'DisplayUrl') 
... 
www.test.com 
www.speakeasy.net/speedtest 
+0

нет удача. Я попытался сделать результаты в нижнем регистре, так как это так, как в JSON, но все равно ничего. –

+0

@ChrisHall: можете ли вы дать нам * образец * JSON, который вы получаете, пожалуйста? Измените свой вопрос. –

+0

@ChrisHall: Что мы делаем, это документация, в которой четко указаны «результаты» [«Веб»] - это словарь с ключом «Результаты», последний - список. Но если ваш запрос возвращает какой-то другой JSON, я бы хотел это увидеть. –

-1

Это более вложенный, чем кажется.

Вот пример вывода JSON из docs:

"Web":{ 
      "Total":5100, 
      "Offset":0, 
      "Results":[ 
       { 
        "Title":"Testign part 2 - Tiernan OTooles Programming Blog", 
        "Description":"If this works, it means nothing really, but i have managed to build a .TEXT blog posting app. could be handy if i move my main blog to .TEXT, which i am thinking about..", 
        "Url":"http:\/\/weblogs.asp.net\/tiernanotoole\/archive\/2004\/09\/24\/233830.aspx", 
        "DisplayUrl":"http:\/\/weblogs.asp.net\/tiernanotoole\/archive\/2004\/09\/24\/233830.aspx", 
        "DateTime":"2008-10-21T05:08:05Z" 
       } 

Обратите внимание, что DisplayUrl находится внутри списка, сохраненного с помощью ключа Results. Таким образом, для его получения:

for item in results.get('Web'. {}).get('Results', []): 
     print item.get('DisplayUrl', "Not Found") 

Надеюсь, это поможет!

+0

Исправлено, или я надеюсь на это. – aIKid

+0

Нет радости. Документация API, похоже, не охватывает синтаксический анализ, а только отправку запроса. –

+0

@aIKid: Попробуйте запустить код с помощью 'results = {}'; вы получите ошибку атрибута. –

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