从Python子字典访问值

2024-06-26 00:02:33 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

^{pr2}$

我想从每个条目中提取'url'值,但是条目似乎没有一个可以向下钻取的键。我怎样才能访问这些文件?我以为:

resp["url]

会有用的,但我一点运气都没有。我理想的输出应该是:

[url1, url2]

Tags: keyhttpstestimportapijsonurl网页
3条回答

你所拥有的是一份口述清单。所以你必须先得到列表中的元素,然后才能把它们当作dicts来对待。在

例如,第一个URL是results[0]['url']。或者,如果你想对每个URL都做些什么,你必须做'forresult-in-results:dosomething(result['URL'])`。在

那么,如果你想得到所有网址的列表呢?在

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

当然,如果您理解列表的含义,则可以使其更紧凑:

^{pr2}$
如果你要在这个结构上做很多复杂的查找,有两个选项可以考虑。在


首先,可以将数据重新构造为更易于使用的形式。例如,如果您需要做很多事情,比如查找来自北达科他州的参议员,那么最好写senate['ND'],而不是{}。您可以使用:

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

显然,这很复杂,而且只有在其他地方节省更多的复杂性时才有用。在


还有(至少)三种不同的迷你语言可以搜索嵌套的list和dict结构,键路径作为字符串,使用通配符jsonpath、dpath和kvc,它们都有PyPI上的库,您可以查找它们。它们都有一个学习曲线,如果你只是在数据上做一个简单的搜索,那么它们就有点过头了。但是如果你要做大量的搜索,你可以把每一个都写成urls = search(results, '*.url')而不是{}这一事实有时会有回报。在

您需要从resp列表中依次提取每个URL。简单的列表理解可以:

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

能够在以下情况下使用:

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

相关问题 更多 >