J'ai gratté une page Web à l'aide d'une API et je souhaite accéder à une partie des résultats, mais j'ai du mal à y accéder:

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

Les résultats sont publiés dans un format de dictionnaire qui ressemble à ceci:

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

Je veux extraire la valeur «url» de chaque entrée, mais les entrées ne semblent pas avoir de clé permettant de forer. Comment puis-je y accéder? Je pensais que:

resp["url]

Ça marcherait, mais je n'ai pas eu de chance. La sortie que je souhaiterais idéalement serait quelque chose comme:

[url1, url2]
2
sabrina 23 mai 2018 à 18:51

3 réponses

Meilleure réponse

A pu faire fonctionner cela avec:

for each in resp['results']:
print(each['url'])
-1
sabrina 23 mai 2018 à 17:56

Ce que vous avez, c'est une liste de dict. Vous devez donc d'abord obtenir les éléments de cette liste, avant de pouvoir les traiter comme des dict.

Par exemple, la première URL est results[0]['url']. Ou, si vous voulez faire quelque chose avec chaque URL, vous devez faire «pour obtenir des résultats: dosomething (result ['url'])».

Et si vous souhaitez obtenir une liste de toutes les URL?

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

Bien sûr, vous pouvez rendre cela plus compact si vous comprenez les compréhensions de liste:

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

Si vous allez faire beaucoup de recherches compliquées sur cette structure, il y a deux options à considérer.


Tout d'abord, vous pouvez restructurer les données dans un formulaire plus facile à utiliser. Par exemple, si vous devez faire beaucoup de choses comme rechercher le sénateur du Dakota du Nord, ce serait bien si vous pouviez écrire senate['ND'] au lieu de [result for result in results if result['state'] == 'ND' and result['chamber'] == 'Senate']. Vous pouvez le faire avec:

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

Évidemment, c'est compliqué, et ce n'est utile que si cela vous fait gagner plus de complexité ailleurs, plusieurs fois.


Il existe également (au moins) trois mini-langages différents pour rechercher des structures de liste et de dict imbriquées avec des chemins de clé comme chaînes, avec des caractères génériques - jsonpath, dpath et kvc - et ils ont tous des bibliothèques sur PyPI que vous pouvez rechercher. Ils ont tous un peu de courbe d'apprentissage et sont exagérés si vous ne faites qu'une simple recherche sur les données. Mais si vous faites beaucoup de recherches, le fait que vous puissiez écrire chacune comme, disons, urls = search(results, '*.url') au lieu de urls = [result['url'] for result in results] peut parfois être payant.

2
abarnert 23 mai 2018 à 16:09

Vous devez extraire chaque URL de votre liste resp. Une simple compréhension de liste ferait:

urls = [entry['url'] for entry in resp]
2
301_Moved_Permanently 23 mai 2018 à 16:00