Partage
  • Partager sur Facebook
  • Partager sur Twitter

Récupérer les données d' un dictionnaire

Message erreur

Sujet résolu
    30 août 2024 à 13:55:20

    Bonjour,

    Malgré toutes les documentations lues et essais réalisés, je n' arrive pas à ouvrir une page web depuis un dictionnaire. Mon code de départ:

    #! /usr/bin/env python 3
    
    from pathlib import Path
    import csv
    from dictionnaire.dico import titres
    import requests
    from bs4 import BeautifulSoup as bs
    import datetime
    
    #Vérification de l' éxistance d' un fichier
    fichier = Path('/mnt/El_Casot/Yvon/Finance/Bourse/conseils.csv')
    if fichier.exists():
        fichier.unlink()
    
    titres
    
    #Récupération de la clé du titre
    for cf, chm in titres.items() :
        url = chm
        cfTtr = cf

    je joins également le dictionnaire:

    titres = [
    {"cf" : "1", "chm": "https://www.boursorama.com/cours/1rPAF/"},
    {"cf": "2", "chm": "https://www.boursorama.com/cours/1rPACA/"},
    {"cf": "5", "chm": "https://www.boursorama.com/cours/1rPFDJ/"},
    {"cf": "7", "chm": "https://www.boursorama.com/cours/1rPRNO/"},
    {"cf": "8", "chm": "https://www.boursorama.com/cours/1rPCA/"},
    {"cf": "10", "chm": "https://www.boursorama.com/cours/1rPGLE/"},
    {"cf": "11", "chm": "https://www.boursorama.cocours/1rPSGO/"},
    {"cf": "12", "chm":"https://www.boursorama.com/cours/1rPABNX/"}
    ]

    cf correspond à la clé contenu dans une table de BDD. Les numéros ne se suivent pas forcément car, certains enregistrement ne correspondent plus à rien.

    chm correspond à la page web à ouvrir.

    Je pense que l' erreur provient du dictionnaire?

    Le message d' erreur me dit:

    ERROR   thonny.backend: Exception in _trace
    Traceback (most recent call last):
      File "/usr/lib/python3/dist-packages/thonny/plugins/cpython/cpython_backend.py", line 1787, in _trace
        return self._trace_and_catch(frame, event, arg)
      File "/usr/lib/python3/dist-packages/thonny/plugins/cpython/cpython_backend.py", line 1862, in _trace_and_catch
        assert last_custom_frame.event.startswith("before_")
    AssertionError
    Traceback (most recent call last):
      File "/mnt/El_Casot/Yvon/Informatique/Programmation/Python/Exercice/cheminDossiers.py", line 18, in <module>
        for cf, chm in titres.items() :
    AttributeError: 'tuple' object has no attribute 'items'

    Désolé de vous importuner sur un sujet aussi simple mais je ne comprends pas ce message et la manière de la contourner.

    Pour info, je suis sous Xubuntu 22, python 3.10.12

    Cordialement



    • Partager sur Facebook
    • Partager sur Twitter
      30 août 2024 à 14:48:41

      La première erreur provient du debuggeur de thonny, la seconde, plus liée au code, dit que "titres" est un tuple qui, de ce fait, n'a pas d'attribut items.

      remarque: le "titres" montré ressemble plutôt à une liste de dictionnaires.

      Ouvrez un tuto et apprenez les bases...

      • Partager sur Facebook
      • Partager sur Twitter
        30 août 2024 à 20:53:50

        Bonsoir,

        Pour l' erreur thonny, je l' avais vue et recherche un autre éditeur.

        Ce que je ne comprends pas c' est que nous avons à faire à une liste de dictionnaires mais que l' erreur mentionnée concerne les tuples.L' erreur de base de thonny peut-elle justifiée la déclaration sur les tuples?

        Cordialement

        -
        Edité par El_Catala 30 août 2024 à 20:54:28

        • Partager sur Facebook
        • Partager sur Twitter
          30 août 2024 à 22:06:19

          El_Catala a écrit:

          Ce que je ne comprends pas c' est que nous avons à faire à une liste de dictionnaires mais que l' erreur mentionnée concerne les tuples.L' erreur de base de thonny peut-elle justifiée la déclaration sur les tuples?

          Vous montrez des bouts de code qui ne permettent pas de reproduire quoi que ce soit.

          A partir de là, on peut tout imaginer mais quel intérêt?

          • Partager sur Facebook
          • Partager sur Twitter
            31 août 2024 à 14:01:38

            Bonjour,

            Le code est complet, tout au moins dans sa première partie. Comme vous pouvez vous en douter, la finalité du programme est de récupérer des données de page web.

            Si cette première partie ne fonctionne pas, la suite ne peut pas fonctionner.

            Dans cette première partie, le but est de placer dans une variable la clé du premier dictionnaire puis dans une seconde le chemin de la page web. L' url étant placé dans cette deuxième variable, le programme pouurra ramené par exemple:

            le risque ESG,

            la cote obtenue par la société,

            la date du consensus,

            etc...

            et ceci pour toutes les valeurs du dictionnaire.

            Cordialement

            -
            Edité par El_Catala 31 août 2024 à 14:03:21

            • Partager sur Facebook
            • Partager sur Twitter
              31 août 2024 à 15:38:03

              Bah si c'est une liste, tu itères dessus de manière simple et lisible

              for titre in titres:
                  cf = titre["cf"]
                  url = titre["chm"]
              
                  try:
                      response = requests.get(url)
                      response.raise_for_status()
                      # Utilisation de BS...
                      
                      print(f"Data fetched for {cf} from {url}")
                  
                  except requests.exceptions.RequestException as e:
                      print(f"Failed to fetch data for {cf} from {url}: {e}")
              
              # Suite...



              • Partager sur Facebook
              • Partager sur Twitter

              Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
              La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                31 août 2024 à 16:53:55

                El_Catala a écrit:

                Le code est complet, tout au moins dans sa première partie. Comme vous pouvez vous en douter, la finalité du programme est de récupérer des données de page web. 

                Si le code était complet, je pourrais reproduire l'erreur et savoir pourquoi titres est tuple plutôt que liste. Après c'est vous qui voyez mais si vous n'arrivez pas à poser correctement un problème aussi simple, c'est que vous avez négligé d'apprendre les bases... et qu'il sera difficile de réaliser la suite de votre programme.

                • Partager sur Facebook
                • Partager sur Twitter
                  1 septembre 2024 à 2:24:25

                  > from dictionnaire.dico import titres

                  Ce serait intéressant de savoir ce qu'il y a dans ce !module.

                  Le fait de placer  titres  seul sur la ligne ne fait rien. L'expression est évaluée et le résultat est perdu.
                  Considère l'exemple suivant qui ne donne rien non plus:
                  -
                  D = [ {'a': 'aaa', 'b': 'bbb'}, {'c': 'ccc', 'd': 'ddd'} ]
                  D
                  3 == 4

                  -
                  Edité par PierrotLeFou 1 septembre 2024 à 2:36:25

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Le Tout est souvent plus grand que la somme de ses parties.

                    1 septembre 2024 à 15:01:28

                    Bonjour,

                    Merci à vous tous de votre aide. En fait mea culpa, l' erreur venait bien de la liste de dictionnaires. en fait au lieu d' écrire:

                    titres : [

                    etc ...
                    ]
                    j' avais écrit les dictionnaires sans les[].Désolé de ne pas m' en être rendu compte.
                    C' est la solution de fred1599 qui m' a mis sur la voie.
                    Pour la remarque de PierrotleFou il a entièrement raison. Dans ma petite tête, il me semblai qu' il fallait appeler la liste alors que l' import fait le travail.
                    Pour le fun, je vous joins la suite du programme en cours de réalisation. Bon de nombreux points sont améliorables mais je vais procéder par étape.
                    Il reste, pour la moment la partie création du fichierCSVà réaliser.
                    Ce fichier sera par la suite importé dans une table de LibreOffice Base.
                    #! /usr/bin/env python 3
                    
                    from pathlib import Path
                    import csv
                    from dictionnaire.dico import titres
                    import requests
                    from bs4 import BeautifulSoup as bs
                    import datetime
                    
                    #Vérification de l' éxistance d' un fichier
                    fichier = Path('/mnt/El_Casot/Yvon/Finance/Bourse/conseils.csv')
                    if fichier.exists():
                        fichier.unlink()
                    
                    #Récupération de la clé du titre
                    for dicTitre in titres:
                        cfTitre = dicTitre["cf"]
                        urlTitre = dicTitre["chm"]
                        try:
                            #Ouvrir la page web
                            rqt = requests.get(urlTitre)
                            html = rqt.content
                            soup = bs(html, "lxml")
                            jauges = soup.find_all('div',{"class":"c-median-gauge"})
                            jauge = jauges[1].find_all('div', {'class':'c-median-gauge__step'}) 
                            #Obtenir la cote du Risque ESG
                            y = soup.find('div',{'class':'c-median-gauge__tooltip'})
                            esgTitre = y.string.strip()
                            #print ('Les risques ESG sont évalués à : ', esgTitre)
                            #Evaluation du Risque ESG
                            coteEsg = esgTitre[0:len(esgTitre)-4]
                            w = coteEsg.replace(',','.')
                            z = float(w)
                            if z <= 10 :
                                statTitre = 0 #("Négligable")
                            elif z>10 and z<=20:
                                statTitre = 1 #('Faible')
                            elif z>20 and z  <=30:
                                 statTitre = 2 #('Moyen')
                            elif z > 30 and z <= 40:
                                statTitre = 3 #('Elevé')
                            elif z > 40 :
                                statTitre = 4 #('Sévère')
                            else:
                                statTitre = 5
                            #Récupération de la date du consensus
                            x = soup.find_all('span',{'class':'c-heading__text / o-flag__body'})[8].text.strip()
                            dteCons=x[len(x)-9:len(x)]
                            v = len(dteCons)
                            if (len(dteCons)) == 9:
                                dateConsensus = dteCons[1:len(dteCons)]
                                #print (dateConsensus)
                            elif v == 8:
                                dteCons
                            else :
                                date = datetime.date.today()
                            #print(date.year)
                            dateConsensus = dteCons
                            # Récupération du conseil sur titre
                            for elt in jauge:
                                if tooltip := elt.find('div', {'class':'c-median-gauge__tooltip'}):
                                    #print(tooltip.text.strip())
                                    jauge_text = elt.find('p',{'class':'c-median-gauge__text'})
                                    b = jauge_text.text.strip().split()
                                    cleConsensus = b[0]
                                    cleConsensus = cleConsensus[:1]
                                    #print (cleConsensus)
                                    if cleConsensus == ' ':
                                        cleConsensus = 0
                            print ('Clé du titre :',cfTitre, 'Risque ESG : ',esgTitre, 'Evaluation ESG : ', statTitre,\
                                    'Date du consensus : ', dteCons,'Consensus : ', cleConsensus)    
                        except :
                            print('Cléf du titre :', cfTitre, 'Risque ESG : ', 0, 'Cote ESG : ', 5)
                            pass
                    Encore merci de votre aide et bonne fin de journée.
                    Cordialement

                    -
                    Edité par El_Catala 1 septembre 2024 à 15:02:09

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Récupérer les données d' un dictionnaire

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    • Editeur
                    • Markdown