Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Python子字典访问值_Python_Json_Python 3.x_Dictionary_Request - Fatal编程技术网

从Python子字典访问值

从Python子字典访问值,python,json,python-3.x,dictionary,request,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() 结果以字典格式显示,如下

我使用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'}]
我想从每个条目中提取“url”值,但这些条目似乎没有一个键,我无法通过它进行深入查看。我怎样才能访问这些?我想:

resp["url]
会有用的,但我运气不好。理想情况下,我想要的输出是:

[url1, url2]

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

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

那么,如果你想得到所有URL的列表呢

urls = []
for result in results:
    url = result['url']
    results.append(url)
当然,如果您理解列表的理解,您可以使其更加紧凑:

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

如果你要对这个结构做很多复杂的查找,有两个选项需要考虑。


首先,您可以将数据重组为更易于使用的形式。例如,如果你需要做很多事情,比如查找来自北达科他州的参议员,如果你可以编写
参议院['ND']
,而不是
[结果为结果,如果结果['state']='ND'和结果['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'}
显然,这是复杂的,而且只有当它在其他地方多次为您节省更多的复杂性时,它才有用



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

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

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

能够通过以下方式实现此功能:

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

这是有道理的,但给我带来了一个错误
“TypeError:字符串索引必须是整数”
@mathias@sabrina如果
resp
确实是您在问题中发布的内容,则不应如此。你确定
resp
是一个字典列表吗?与上面类似,当我尝试调用时:
url=[resp['url']for resp in resp]
我被抛出
“类型错误:字符串索引必须是整数”
@如果您指出您问题中的列表位于
'result'
键下,我们本可以将其包含在我们的答案中。就目前而言,
resp['result']
对于问题的当前状态来说是一种纯粹的魔法。在尝试了你的代码之后,我发现了你可能存在的问题。您的请求为我返回了
{'message':None}
,因此当您尝试获取
url
时,显然会出现错误,而该url不存在。还显示您需要一个api密钥,因此如果您没有api密钥,则需要注册以从api获取实际数据