我使用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]
答案 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'])