Je télécharge des données sur les statistiques de Yahoo Finance et la sortie résultante est un dictionnaire imbriqué Python. Fondamentalement, je dois rechercher "Entreprisevalue" et "Trailingpe" à l'intérieur du dictionnaire imbriqué.
Ceci existera dans la sortie - "Entreprisevalue". P>
Ce ne sera pas - "Trailingpe". P>
J'ai besoin d'identifier les éléments inexistants afin que je puisse les contourner et continuer à traiter les données. P>
J'ai essayé d'obtenir le bloc de code suivant fonctionner ci-dessous. Cependant, je n'ai pas encore eu de chance. P>
Tout semble fonctionner jusqu'à ce que j'appelle la fonction de recherche récursive. P>
Le code actuel ne trouve pas "Entreprisevalue" ou "Trailingpe". p>
Toute aide serait grandement appréciée. P>
import requests, re, json, pprint, datetime p = re.compile(r'root\.App\.main = (.*);') tickers = ['APT.AX'] results = {} dict_searchFor = { 'Enterprise_Value' : 'enterpriseValue' , 'Trailing_PE' : 'trailingPE' } def recursive_lookup(k, d): if k in d: return d[k] for v in d.values(): if isinstance(v, dict): return recursive_lookup(k, v) return None with requests.Session() as s: for ticker in tickers: r = s.get('https://finance.yahoo.com/quote/{}/key-statistics?p={}'.format(ticker,ticker)) data = json.loads(p.findall(r.text)[0]) d = data['context']['dispatcher']['stores']['QuoteSummaryStore'] print(d) for k in dict_searchFor: value = dict_searchFor[k] print(k) print(value) recursive_lookup(k, d)
3 Réponses :
Utilisez la méthode "Obtenir" de dictionnaire. Vous pouvez affecter une valeur au cas où la touche recherchée n'existe pas:
Vos premiers paramètres d'appel sont incorrects. Passez la valeur à votre RECURSIVE_LOOKUP.
import requests import re import json import pprint import datetime p = re.compile(r'root\.App\.main = (.*);') tickers = ['APT.AX'] results = {} dict_searchFor = { 'Enterprise_Value': 'enterpriseValue', 'Trailing_PE': 'trailingPE' } def recursive_lookup(k, d): if k in d: return d[k] for v in d.values(): if isinstance(v, dict): return recursive_lookup(k, v) return None with requests.Session() as s: for ticker in tickers: r = s.get( 'https://finance.yahoo.com/quote/{}/key-statistics?p={}'.format(ticker, ticker)) data = json.loads(p.findall(r.text)[0]) d = data['context']['dispatcher']['stores']['QuoteSummaryStore'] # print(d) for k in dict_searchFor: value = dict_searchFor[k] print(k) # print(value) print(recursive_lookup(value, d))
Salut Pramote. J'ai essayé votre méthode et ça a fonctionné super! Merci beaucoup!
Votre problème est probablement que vous dans le Je crois que cette version devrait fonctionner comme prévu: P > RECURSIVE_LOOKUP () CODE> renvoie le résultat de la première recherche dict, même si ce n'est aucun.
def recursive_lookup(needle, haystack):
for key, value in haystack.items():
if key == needle:
return value
if isinstance(value, dict) and nested_value := recursive_lookup(needle, value):
return nested_value