从Python子字典中访问值

时间:2018-05-23 15:51:49

标签: python json python-3.x dictionary request

我使用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()

结果以字典格式显示,如下所示:

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

我想提取“网址”。每个条目的值,但条目似乎没有一个我可以向下钻取的键。我怎样才能访问这些?我想:

resp["url]

会工作,但我没有运气。理想情况下我想要的输出是:

[url1, url2]

3 个答案:

答案 0 :(得分:2)

你所拥有的是一系列的词汇。所以你必须首先获得该列表的元素,然后才能将它们视为dicts。

例如,第一个网址是results[0]['url']。或者,如果你想对每个URL做一些事情,你必须做'结果的结果:dosomething(result ['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],这有时可以获得回报。

答案 1 :(得分:2)

您需要依次从resp列表中提取每个网址。一个简单的列表理解就可以了:

urls = [entry['url'] for entry in resp]

答案 2 :(得分:-1)

能够使用:

for each in resp['results']:
print(each['url'])