Доступ к значениям из под-словаря Python - PullRequest
0 голосов
/ 23 мая 2018

Я очистил веб-страницу с помощью API и хочу получить доступ к одной части результатов, но мне трудно получить к ней доступ:

import requests
import json
headers = {'x-api-key': 'my_key'}
test_url= "https://api.propublica.org/congress/v1/statements/date/2018-05- 
22.json"
resp = requests.get(test_url, headers=headers).json()

Результаты отображаются в формате словаря, который выглядит следующим образом:this:

[{'chamber': 'Senate',
          'congress': 115,
          'party': 'R',
          'state': 'NC',
          'url': 'url1_goes_here'},
{'chamber': 'Senate',
          'congress': 115,
          'party': 'R',
          'state': 'ND',
          'url': 'url2_goes_here'}]

Я хочу извлечь значение 'url' из каждой записи, но в записях, похоже, нет ключа, с помощью которого я могу углубиться.Как я могу получить доступ к этим?Я думал, что:

resp["url]

Будет работать, но мне не повезло.В идеале я хотел бы получить что-то вроде:

[url1, url2]

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

Вам по очереди нужно извлечь каждый URL из списка resp.Простое понимание списка сделало бы:

urls = [entry['url'] for entry in resp]
0 голосов
/ 23 мая 2018

удалось получить это работает с:

for each in resp['results']:
print(each['url'])
0 голосов
/ 23 мая 2018

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

Например, первый URL-адрес - results[0]['url'].Или, если вы хотите что-то сделать с каждым URL, вы должны сделать 'для результата в результате: dosomething (result [' url ']) `.

Итак, что, если вы хотите получить списоквсе URL-адреса?

urls = []
for result in results:
    url = result['url']
    results.append(url)

Конечно, вы можете сделать это более компактным, если понимаете понимание списка:

urls = [result['url'] for result in results]

Если вы собираетесь делать многоПри сложном поиске в этой структуре есть два варианта:


Во-первых, вы можете реструктурировать данные в форму, которую проще использовать.Например, если вам нужно много чего сделать, например поискать сенатора из Северной Дакоты, было бы неплохо, если бы вы написали senate['ND'] вместо [result for result in results if result['state'] == 'ND' and result['chamber'] == 'Senate'].Вы можете сделать это с помощью:

senate = {result['state']: result for result in results if result['chamber'] == 'Senate'}
house = {result['state']: result for result in results if result['chamber'] == 'House'}

Очевидно, что это сложно, и это полезно только в том случае, если экономит вашу сложность в другом месте, многократно.


Есть также (по крайней мере,) три различных мини-языка для поиска структур вложенных списков и диктов с ключевыми путями в виде строк, с подстановочными знаками - jsonpath, dpath и kvc - и все они имеют библиотеки PyPI, которые вы можете искать.У всех них есть некоторая кривая обучения, и они излишни, если вы просто делаете один простой поиск по данным.Но если вы собираетесь проводить много поисков, то тот факт, что вы можете написать каждый как, скажем, urls = search(results, '*.url') вместо urls = [result['url'] for result in results], иногда может окупиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...