0
votes

Python - Comment rechercher une valeur dans un dictionnaire

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)


0 commentaires

3 Réponses :


0
votes

Utilisez la méthode "Obtenir" de dictionnaire. Vous pouvez affecter une valeur au cas où la touche recherchée n'existe pas: xxx


0 commentaires

1
votes

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


1 commentaires

Salut Pramote. J'ai essayé votre méthode et ça a fonctionné super! Merci beaucoup!



0
votes

Votre problème est probablement que vous dans le RECURSIVE_LOOKUP () CODE> renvoie le résultat de la première recherche dict, même si ce n'est aucun.

Je crois que cette version devrait fonctionner comme prévu: P >

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


0 commentaires