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