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
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
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.
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?
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?
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:
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...
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)
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.
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
Le Tout est souvent plus grand que la somme de ses parties.
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
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é.
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)
Le Tout est souvent plus grand que la somme de ses parties.