IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Lire les données d'une page web en python


Sujet :

Python

  1. #1
    Membre actif
    Homme Profil pro
    Aidant
    Inscrit en
    Janvier 2024
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Aidant
    Secteur : Services à domicile

    Informations forums :
    Inscription : Janvier 2024
    Messages : 55
    Par défaut Lire les données d'une page web en python
    Bonjour à tous,
    Je suis plutôt débutant en python et je cherche à faire un programme qui va chercher des infos sur une page web avec authentification par user/password.
    La page en question est celle de ma chaudière qui contient l'état de fonctionnement de tous ses système que je voudrai recueillir pour les utiliser dans d'autres programmes de domotique.
    J'ai écris le code suivant mais il ne me retourne que le code source de la page web et pas la page en question....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    import urllib.request
     
    url = 'http://192.168.1.78/index.htm'
    username = 'admin'
    password = 'boiler'
    p = urllib.request.HTTPPasswordMgrWithDefaultRealm()
     
    p.add_password(None, url, username, password)
     
    handler = urllib.request.HTTPBasicAuthHandler(p)
    opener = urllib.request.build_opener(handler)
    urllib.request.install_opener(opener)
     
    page = urllib.request.urlopen(url).read()
    #print(page.readlines())
    #pages2 = page.readlines()
    print(page)
    Pouvez-vous m'aider ?

  2. #2
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 199
    Par défaut
    Hello,
    pour interagir avec des pages web (cliquer sur des boutons, remplir des champs etc...) et récupérer des pages dynamiques (pages qui sont générées dans le navigateur par des scripts inclus dans le source de la page), il faut piloter un navigateur installé sur sa machine. Selenium permet de le faire avec des navigateurs comme Edge, Chrome, Firefox, Safari.
    Ami calmant, J.P

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 715
    Par défaut
    Citation Envoyé par Toine74 Voir le message
    Je suis plutôt débutant en python et je cherche à faire un programme qui va chercher des infos sur une page web avec authentification par user/password.
    Si la variable url est 'http://192.168.1.78/index.htm', urllib.request.urlopen(url) ne retournera rien d'autre.

    La question est de savoir quelle URL permettrait de récupérer les informations de la chaudière.

    Ce qui dépend du contenu de la page index.htm. Soit elle ne contient que du HTML et il faudra récupèrer l'URL de la page qui retourne les informations de la chaudière, soit la page contient du javascript et il faudra utiliser un navigateur Web (via Selenium) pour interpréter ce javascript en interagissant comme un utilisateur.

    Le point de départ est donc d'arriver à lire le HTML de la page index.htm pour savoir que faire... et pour l'instant, rien ne concerne le langage python.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 827
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Toine74 Voir le message
    password = 'boiler'
    Bravo

    Citation Envoyé par Toine74 Voir le message
    La page en question est celle de ma chaudière qui contient l'état de fonctionnement de tous ses système que je voudrai recueillir pour les utiliser dans d'autres programmes de domotique.
    Est-ce que par hasard la chaudière n'aurait pas une sortie donnant directement les infos ? Une espèce webservice qui éviterait le serveur web intermédiaire ?
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre actif
    Homme Profil pro
    Aidant
    Inscrit en
    Janvier 2024
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Aidant
    Secteur : Services à domicile

    Informations forums :
    Inscription : Janvier 2024
    Messages : 55
    Par défaut
    Merci à tous pour ces réponses !
    Déjà Jurassic Pork j'aurai des questions pour toi var justement une des prochaines étapes de mon script python est justement d'aller sur la page de la chaudière pour pouvoir cliquer sur les boutons "turn on/turn off" de la chaudière.

    Pour préciser ma demande, ma chaudière est connectée au réseau local de ma maison. 192.168.1.74 est son adresse que je tape directement dans mon navigateur web (sous windows). Après avoir rentré l'user et le password je tombe sur une page comme ça :

    Nom : Chaudière_status.jpg
Affichages : 720
Taille : 127,2 Ko



    J'ai écris un petit script shell qui récupère mes données que je veux via la commande curl. Voila le script :

    Code shell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    #!/bin/sh
    # -*- coding: utf-8 -*-
     
    ip_domoticz="http://192.168.1.74:8080"
    idx_Systeme="12"
    idx_Auger=13
    idx_Nettoyage=14
    idx_Recharge=15
    idx_Pompe_ECS=16
    idx_Pompe_Radiateurs=17
    idx_Allumage=18
    idx_Ventilateur=19
     
    #Lecture du fichier qui contient les données de la chaudière
     
    curl <a href="http://192.168.1.78/status.xml" target="_blank">http://192.168.1.78/status.xml</a> --user admin:boiler > parametres 
     
    # On récupère les lignes du fichier parametres2 qui nous interresse
     
    head -n 20 parametres | tail -n 14 > parametres2
     
    #Extraction des chiffres Ã* envoyer Ã* domoticz
     
    cut -d'>' -f2 parametres2 > parametres3
    cut -d'<' -f1 parametres3 > parametres4
    rm parametres2
    rm parametres3
     
    #cat parametres4
     
    #initialisation du compteur
    i=0
    while read ligne; do
     data=$ligne
     idx_domoticz=$(($idx_Systeme+$i))
     resultat=""
      if [ $data -eq 1 ]
      then
       resultat="En_marche"
       Resultat="$ip_domoticz/json.htm?type=command&param=udevice&idx=$idx_domoticz&svalue=$resultat"
       sudo curl -s $Resultat
      elif [ $data -eq 0 ]
      then
       resultat="A_l'arrêt"
       Resultat="$ip_domoticz/json.htm?type=command&param=udevice&idx=$idx_domoticz&svalue=$resultat"   
       sudo curl -s $Resultat
      else
       resultat=$ligne
       Resultat="$ip_domoticz/json.htm?type=command&param=udevice&idx=$idx_domoticz&svalue=$resultat"
       sudo curl -s $Resultat   
      fi
    #incrementation du parmetre
    i=$(($i+1))
     
    done < parametres4

    C'était que départ pour l'utiliser dans domoticz mai je veux faire mon propre code. Ce script shell me donne en sortie :
    2022-11-10 20:33:35,0,0,0,0,0,0,0,9,8,3,5,0,39
    Un fichier qui compte une ligne toutes les 30s et qui rassemble les paramètres de la chaudière via crontab.
    Alors c'est vrai, tout cela marche très bien mais je voudrais rassembler toutes ces différentes étapes dans mon script python.

    Est-ce possible ?

    Antoine

  6. #6
    Membre actif
    Homme Profil pro
    Aidant
    Inscrit en
    Janvier 2024
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Aidant
    Secteur : Services à domicile

    Informations forums :
    Inscription : Janvier 2024
    Messages : 55
    Par défaut
    re-moi.

    Quand je lance mon script oython donné dans le premier message j'obtiens ceci :

    b'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">\r\n<head><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-9" />\r\n<title>TCNET Boiler Controller</title>\r\n<link href="/mchp.css" rel="stylesheet" type="text/css" />\r\n<script src="/mchp.js" type="text/javascript"></script>\r\n</head>\r\n\r\n<body>\r\n<div id="shadow-one"><div id="shadow-two"><div id="shadow-three"><div id="shadow-four">\r\n<div id="page">\r\n\r\n<div style="padding:0 0 5px 5px"><img src="/logo.gif" alt="Technoflame" /></div>\r\n\r\n<div id="title"><div class="right">TCNET Boiler Controller Web Access</div><span id="hello">&nbsp;</span></div>\r\n\r\n<div id="menu">\r\n<a href="/index.htm">Status</a>\r\n<a href="/tsetup.htm">Temperature Setup</a>\r\n<a href="/wtmon.htm">Week Timer Setup</a>\r\n<!-- <a href="/errlog.htm">Error Log</a> -->\r\n<a href="/protect/config.htm">Network Configuration</a>\r\n<a href="/protect/admin.htm">Administration</a>\r\n\r\n</div>\r\n<div id="content">\r\n<h1>Welcome!</h1>\r\n<p>Thank you for choosing Technoflame TCNET Boiler Controller.</p>\r\n<p>Current status of your boiler:</p>\r\n<div id="ignition_error" style="display:none"><p class="error">Error: Ignition failed.</p></div>\t\r\n<div id="nofuel_error" style="display:none"><p class="error">Error: Out of pellets.</p></div>\t\r\n<div id="overtemp_error" style="display:none"><p class="error">Error: Overtemperature detected.</p></div>\t\r\n<div id="overcurrent_error" style="display:none"><p class="error">Error: Overcurrent detected.</p></div>\t\r\n<div id="backburn_error" style="display:none"><p class="error">Error: Back burning to auger!.</p></div>\t\r\n\r\n<div id="status">\r\n<div id="loading" style="display:none"><p class="error">Error: Network connection lost.</p></div>\t\r\n\r\n<div id="display"> \r\n<p>Temperatures:<br /></p>\r\n\t\t<p>Building Heating: <span id="btemp" style="font-weight:normal">?</span>&deg;C</p>\t\t\r\n\t\t<p>Utility Water: <span id="utemp" style="font-weight:normal">?</span>&deg;C</p>\t\t\r\n\t\t<p>Outside Temp: <span id="otemp" style="font-weight:normal">?</span>&deg;C</p>\t\t\r\n\t\t<p>Flue Temp: <span id="ftemp" style="font-weight:normal">?</span>&deg;C</p>\t\t\r\n\t\t<p>Output Power: <span id="opwr" style="font-weight:normal">?</span>kW</p>\t\t\r\n <p>CPU Load: <span id="loop0" style="font-weight:normal">?</span>%</p>\r\n<p>Outputs:<br />\r\n<span class="leds">\r\n<table width="190" border="0" cellpadding="0" cellspacing="0">\r\n <tr>\r\n <td width="10"><span id="led0">&bull;</span></td>\r\n <td width="173">System On</td>\r\n </tr>\r\n <tr>\r\n <td width="10"><span id="led1">&bull;</span></td>\r\n <td>Auger</td>\r\n </tr>\r\n <tr>\r\n <td width="10"><span id="led2">&bull;</span></td>\r\n <td>Clean</td>\r\n </tr>\r\n <tr>\r\n <td width="10"><span id="led3">&bull;</span></td>\r\n <td>Refill</td>\r\n </tr>\r\n <tr>\r\n <td width="10"><span id="led4">&bull;</span></td>\r\n <td>Util. Water Pump</td>\r\n </tr>\r\n <tr>\r\n <td width="10"><span id="led5">&bull;</span></td>\r\n <td>Building Heating Pump</td>\r\n </tr>\r\n <tr>\r\n <td width="10"><span id="led6">&bull;</span></td>\r\n <td>Ignition</td>\r\n </tr>\r\n <tr>\r\n <td width="10"><span id="led7">&bull;</span></td>\r\n <td>Fan</td>\r\n </tr>\r\n</table></span></p>\r\n\r\n\t </div>\r\n</div>\r\n\r\n<p>Firmware: v5.25</p>\r\n</div>\r\n<script type="text/javascript">\r\n<!--\r\n// Parses the xmlResponse from status.xml and updates the status box\r\nfunction updateStatus(xmlData) {\r\n\t// Check if a timeout occurred\r\n\tif(!xmlData)\r\n\t{\r\n\t\tdocument.getElementById(\'display\').style.display = \'none\';\r\n\t\tdocument.getElementById(\'loading\').style.display = \'inline\';\r\n\t\treturn;\r\n\t}\r\n\r\n\tdocument.getElementById(\'ignition_error\').style.display = (getXMLValue(xmlData, \'err0\') == \'1\') ? \'inline\' : \'none\'; \r\n\tdocument.getElementById(\'nofuel_error\').style.display = (getXMLValue(xmlData, \'err1\') == \'1\') ? \'inline\' : \'none\'; \r\n\tdocument.getElementById(\'overtemp_error\').style.display = (getXMLValue(xmlData, \'err2\') == \'1\') ? \'inline\' : \'none\'; \r\n\tdocument.getElementById(\'overcurrent_error\').style.display = (getXMLValue(xmlData, \'err3\') == \'1\') ? \'inline\' : \'none\'; \r\n\tdocument.getElementById(\'backburn_error\').style.display = (getXMLValue(xmlData, \'err4\') == \'1\') ? \'inline\' : \'none\'; \r\n\t// Make sure we\'re displaying the status display\r\n\tdocument.getElementById(\'display\').style.display = \'inline\';\r\n\tdocument.getElementById(\'loading\').style.display = \'none\';\r\n\r\n\t// Loop over all the LEDs\r\n\tfor(i = 0; i < 8; i++)\r\n\t\tdocument.getElementById(\'led\' + i).style.color = (getXMLValue(xmlData, \'led\' + i) == \'1\') ? \'#090\' : \'#ddd\';\r\n\r\n\t// Loop over all the buttons\r\n\t//for(i = 0; i < 4; i++)\r\n\t//\tdocument.getElementById(\'btn\' + i).innerHTML = (getXMLValue(xmlData, \'btn\' + i) == \'up\') ? \'OFF\' : \'ON\';\r\n\r\n\t// Update the POT value\r\n\tdocument.getElementById(\'btemp\').innerHTML = getXMLValue(xmlData, \'btemp\');\r\n\tdocument.getElementById(\'utemp\').innerHTML = getXMLValue(xmlData, \'utemp\');\r\n\tdocument.getElementById(\'otemp\').innerHTML = getXMLValue(xmlData, \'otemp\');\r\n\tdocument.getElementById(\'ftemp\').innerHTML = getXMLValue(xmlData, \'ftemp\');\r\n\tdocument.getElementById(\'opwr\').innerHTML = getXMLValue(xmlData, \'pwr\');\r\n\tdocument.getElementById(\'loop0\').innerHTML = getXMLValue(xmlData, \'debug\');\r\n}\r\nsetTimeout("newAJAXCommand(\'status.xml\', updateStatus, true)",2000);\r\n//-->\r\n</script>\r\n<div class="spacer">&nbsp;</div>\r\n<div id="footer">Copyright &copy; 1999-2012 All rights reserved.<br>Developed by: Nusret Suzme &copy; 2010 </div>\r\n\r\n</div></div></div></div></div>\r\n\r\n</body>\r\n</html>\r\n'
    ....

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 827
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Toine74 Voir le message
    Voila le script...
    Tous les fichiers "parametres2", "parametres3" et autres sont totalement inutiles. Déjà c'est pas propre (tu crées des fichiers qui polluent, tu pourrais au-moins travailler dans "/tmp"). Ensuite c'est long (accès disques) et risque de collision (si ton script est appelé 2 fois en parallèle).
    Si tu peux rediriger une commande dans un fichier, tu peux la rediriger dans une variable.
    Faut remplacer commande >fichier par var="$(commande)". Et pour traiter le résultat, remplacer head -n 20 parametres | tail -n 14 > parametres2 par parametres2="$(echo "$parametres" | tail -n 14)".

    Citation Envoyé par Toine74 Voir le message
    Alors c'est vrai, tout cela marche très bien mais je voudrais rassembler toutes ces différentes étapes dans mon script python.
    Est-ce possible ?
    Ben oui, Python est "Turing complet", tout comme le shell, le C, ou même l'assembleur. Ce que tu fais en shell tu peux le refaire en Python, en C ou même en assembleur. Ce n'est qu'une question de syntaxe. En revanche autant en shell appeler un programme externe (ici curl) et récupérer son résultat c'est ultra simple, autant en Python ça va être plus galère (passer par subprocess). Ben oui, certains langages sont plus adaptés que d'autres à certaines tâches...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 715
    Par défaut
    Citation Envoyé par Toine74 Voir le message
    tout cela marche très bien mais je voudrais rassembler toutes ces différentes étapes dans mon script python.

    Est-ce possible ?
    C'est possible... la question est de savoir si vous allez pouvoir coder çà ou trouver une bonne âme qui fera le boulot pour vous (sachant qu'on ne peut pas tester son code...)

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Membre actif
    Homme Profil pro
    Aidant
    Inscrit en
    Janvier 2024
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Aidant
    Secteur : Services à domicile

    Informations forums :
    Inscription : Janvier 2024
    Messages : 55
    Par défaut
    Bon sang de nom de Zeus...
    En répondant à vos messages j'ai trouvé la solution, l'url n'était pas la bonne :

    Au lieu de http://192.168.1.78/index.htm' il fallait mettre ; http://192.168.1.78/status.xml'
    et là le code me renvoie ce qu'il faut :

    b'<response>\r\n<err0>0</err0>\r\n<err1>0</err1>\r\n<err2>0</err2>\r\n<err3>0</err3>\r\n<err4>0</err4>\r\n<led0>1</led0>\r\n<led1>0</led1>\r\n<led2>0</led2>\r\n<led3>0</led3>\r\n<led4>0</led4>\r\n<led5>1</led5>\r\n<led6>0</led6>\r\n<led7>1</led7>\r\n<btemp>53</btemp>\r\n<utemp>36</utemp>\r\n<otemp>3</otemp>\r\n<ftemp>164</ftemp>\r\n<pwr>10</pwr>\r\n<debug>34</debug>\r\n</response>\r\n'
    YÀ plus qu'à déconcaténer et récupérer les données. Simple comme bonjour et je l'avais sous les yeux depuis le début... Quelle buse !

    Encore merci à tous pour vos réponses qui m'ont permis de trouver la mienne !

    PS : jurassic pork est-ce que je peux te contacter pour avoir des infos pour savoir comment aller cliquer sur un bouton d'une page web depuis un script python ?

    Antoine

  10. #10
    Membre actif
    Homme Profil pro
    Aidant
    Inscrit en
    Janvier 2024
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Aidant
    Secteur : Services à domicile

    Informations forums :
    Inscription : Janvier 2024
    Messages : 55
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Tous les fichiers "parametres2", "parametres3" et autres sont totalement inutiles. Déjà c'est pas propre (tu crées des fichiers qui polluent, tu pourrais au-moins travailler dans "/tmp"). Ensuite c'est long (accès disques) et risque de collision (si ton script est appelé 2 fois en parallèle).
    Si tu peux rediriger une commande dans un fichier, tu peux la rediriger dans une variable.
    Faut remplacer commande >fichier par var="$(commande)". Et pour traiter le résultat, remplacer head -n 20 parametres | tail -n 14 > parametres2 par parametres2="$(echo "$parametres" | tail -n 14)".


    Ben oui, Python est "Turing complet", tout comme le shell, le C, ou même l'assembleur. Ce que tu fais en shell tu peux le refaire en Python, en C ou même en assembleur. Ce n'est qu'une question de syntaxe. En revanche autant en shell appeler un programme externe (ici curl) et récupérer son résultat c'est ultra simple, autant en Python ça va être plus galère (passer par subprocess). Ben oui, certains langages sont plus adaptés que d'autres à certaines tâches...
    Merci Sve@r pour cette réponse ! Effectivement je n'était pas satisfait par ce code. J'ai été obligé de créer les fichiers parametres2 parametres3 parametres4 car je n'arrivais pas à réunir la commande cut -d'>' et cut -d'<' en une seule ligne. Mais je ne connaissais pas le coup de passer par des variables, c'est effectivement bien mieux...

  11. #11
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 060
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 060
    Par défaut
    Bonsoir,

    YÀ plus qu'à déconcaténer et récupérer les données. Simple comme bonjour
    Ça semble être une réponse en XML, que se soit python, bash ou autres langages, avoir un parser XML me semble incontournable... En python c'est lxml ou BeautiFulSoup, en bash c'est 4xpath, xmlstartlet, ...
    Donc pas si simple, faut un minimum de travail, de tests !

    le code me renvoie ce qu'il faut
    C'est du texte brut, à partir de là, l'analyse textuelle reste plus complexe qu'une analyse du format XML.

    Comme je peux pas tester, à vous d'essayer ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    import urllib.request
    from lxml import etree
    from urllib.error import URLError, HTTPError
    import base64
     
    url = "http://192.168.1.78/status.xml"
     
    request = urllib.request.Request(url)
     
    # Ajouter les informations d'authentification
    credentials = ('admin:boiler').encode()
    encoded_credentials = base64.b64encode(credentials)
    request.add_header('Authorization', 'Basic ' + encoded_credentials.decode())
     
    try:
        with urllib.request.urlopen(request) as response:
            data = response.read()
     
            # Parser le contenu XML
            root = etree.fromstring(data)
     
            # Exemple d'extraction de données
            for element in root:
                print(f"{element.tag}: {element.text}")
     
    except HTTPError as e:
        print(f"Erreur HTTP : {e.code} {e.reason}")
     
    except URLError as e:
        print(f"Erreur d'URL : {e.reason}")
     
    except etree.XMLSyntaxError as e:
        print(f"Erreur de syntaxe XML : {e}")
    Installation de lxml : ICI

    Quel retour avez-vous ? Est-ce plus lisible ?

  12. #12
    Membre actif
    Homme Profil pro
    Aidant
    Inscrit en
    Janvier 2024
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Aidant
    Secteur : Services à domicile

    Informations forums :
    Inscription : Janvier 2024
    Messages : 55
    Par défaut
    wouah fred1599, ton script marche à la perfection... Merci !

    J'ai vraiment encore beaucoup de choses à apprendre en Python... Voila ce que ton code donne :

    err0: 0
    err1: 0
    err2: 0
    err3: 0
    err4: 0
    led0: 0
    led1: 0
    led2: 0
    led3: 0
    led4: 0
    led5: 1
    led6: 0
    led7: 0
    btemp: 34
    utemp: 36
    otemp: -1
    ftemp: 26
    pwr: 0
    debug: 32

    C'esst vraiment super merci encore. Me permettras-tu d'abuser de ta science en te demandant comment tu ferais pour ensuite enregistrer ces données dans un fichier quelconque "Données_Chaudiere.txt" ou chaque ligne donnée par ton code est mise en colonne (une colonne pour chaque ligne de la réponse de ton script) avec en dessous la valeur correspondante qui vient se mettre au fur et à mesure que le script est appelé via crontab ?
    J'ai déja écris un bout de script mais vu comme le tien marche, j'ai honte de le montrer...
    T'es pas obligé hein, mais si tu voulais bien me faire profiter encore un peu de ton savoir, ça le ferait carrément !
    Merci encore

    Antoine

  13. #13
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 060
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 060
    Par défaut
    Bonjour,

    Cool, ça retourne bien ce que je pensais... L'écriture dans un fichier texte ou csv (lignes de plusieurs colonnes) est assez simple en utilisant le module csv.

    Je me suis permis d'ajouter date et heure d'enregistrement dans le fichier pour chaque enregistrement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    import urllib.request
    from lxml import etree
    from urllib.error import URLError, HTTPError
    import base64
    import csv
    import os
    from datetime import datetime
     
    url = "http://192.168.1.78/status.xml"
    csv_file = "Données_Chaudiere.txt"
     
    request = urllib.request.Request(url)
     
    # Ajouter les informations d'authentification
    credentials = ('admin:boiler').encode()
    encoded_credentials = base64.b64encode(credentials)
    request.add_header('Authorization', 'Basic ' + encoded_credentials.decode())
     
    try:
        with urllib.request.urlopen(request) as response:
            data = response.read()
     
            # Parser le contenu XML
            root = etree.fromstring(data)
     
            # Obtenir la date et l'heure actuelles
            current_date = datetime.now().strftime("%d/%m/%Y")
            current_time = datetime.now().strftime("%H:%M:%S")
     
            # Préparer les données pour le fichier CSV
            data_to_write = {"Date": current_date, "Heure": current_time}
            data_to_write.update({element.tag: element.text for element in root})
     
            # Vérifier si le fichier existe pour écrire l'en-tête ou non
            file_exists = os.path.isfile(csv_file)
     
            with open(csv_file, 'a', newline='', encoding='utf-8') as f:
                writer = csv.DictWriter(f, fieldnames=data_to_write.keys())
     
                # Écrire l'en-tête si le fichier est nouveau
                if not file_exists:
                    writer.writeheader()
     
                # Écrire les données
                writer.writerow(data_to_write)
     
    except HTTPError as e:
        print(f"Erreur HTTP : {e.code} {e.reason}")
     
    except URLError as e:
        print(f"Erreur d'URL : {e.reason}")
     
    except etree.XMLSyntaxError as e:
        print(f"Erreur de syntaxe XML : {e}")
    À tester ! Concernant crontab, évidemment c'est pas un sujet python, mais je suppose que ça ne devrait pas être un problème...

  14. #14
    Membre actif
    Homme Profil pro
    Aidant
    Inscrit en
    Janvier 2024
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Aidant
    Secteur : Services à domicile

    Informations forums :
    Inscription : Janvier 2024
    Messages : 55
    Par défaut
    Super merci Fred, c'est effectivement bien plus élégant que mon code et certainement plus efficace. J'étais parti dans des stringsplit qui m'aurai donnée un fichier texte. Un csv c'est farpait je pourrai plus facilement en faire des graphiques... Je vais le tester de suite et je te dis.
    J'ai une dernière précision à te demander, avec crontab (au moins un truc que je maîtrise ) je crée chaque premier du mois un fichier qui a le nom du mois et de l'année (janvier2024, fevrier2024, etc,etc...).
    Je voudrais que lors de l'enregistrement le script aille enregistrer dans le bon fichier en fonction de la date.
    Tu aurais une solution ?
    Encore une fois pas d'obligation hein...

    Merci
    Antoine

  15. #15
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 060
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 060
    Par défaut
    Bah j'aimerai bien savoir si ça fonctionne, je peux pas tester dans un cas réel,

    Pour le nom de fichier en fonction du mois et de l'année, c'est pas très complexe (mais bon, étant donné que tu avais date et heure dans ton contenu de fichier, je vois pas trop l'intérêt)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    import urllib.request
    from lxml import etree
    from urllib.error import URLError, HTTPError
    import base64
    import csv
    import os
    from datetime import datetime
     
    url = "http://192.168.1.78/status.xml"
     
    request = urllib.request.Request(url)
     
    # Ajouter les informations d'authentification
    credentials = ("admin:boiler").encode()
    encoded_credentials = base64.b64encode(credentials)
    request.add_header("Authorization", "Basic " + encoded_credentials.decode())
     
    try:
        with urllib.request.urlopen(request) as response:
            data = response.read()
     
            # Parser le contenu XML
            root = etree.fromstring(data)
     
            # Obtenir la date et l'heure actuelles
            current_datetime = datetime.now()
            current_date = current_datetime.strftime("%Y-%m-%d")
            current_time = current_datetime.strftime("%H:%M:%S")
     
            # Former le nom du fichier en fonction du mois et de l'année
            csv_file = f"Données_Chaudiere_{current_datetime.strftime('%B_%Y')}.txt"  # par exemple "Données_Chaudiere_Janvier_2024.txt"
     
            # Préparer les données pour le fichier CSV
            data_to_write = {"Date": current_date, "Heure": current_time}
            data_to_write.update({element.tag: element.text for element in root})
     
            # Vérifier si le fichier existe pour écrire l'en-tête ou non
            file_exists = os.path.isfile(csv_file)
     
            with open(csv_file, "a", newline="", encoding="utf-8") as f:
                writer = csv.DictWriter(f, fieldnames=data_to_write.keys())
     
                # Écrire l'en-tête si le fichier est nouveau
                if not file_exists:
                    writer.writeheader()
     
                # Écrire les données
                writer.writerow(data_to_write)
     
    except HTTPError as e:
        print(f"Erreur HTTP : {e.code} {e.reason}")
     
    except URLError as e:
        print(f"Erreur d'URL : {e.reason}")
     
    except etree.XMLSyntaxError as e:
        print(f"Erreur de syntaxe XML : {e}")
    Si je pouvais avoir les deux premières lignes du fichier pour vérifier...

  16. #16
    Membre actif
    Homme Profil pro
    Aidant
    Inscrit en
    Janvier 2024
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Aidant
    Secteur : Services à domicile

    Informations forums :
    Inscription : Janvier 2024
    Messages : 55
    Par défaut
    Voila les deux premières lignes du fichier :

    Date,Heure,err0,err1,err2,err3,err4,led0,led1,led2,led3,led4,led5,led6,led7,btemp,utemp,otemp,ftemp,pwr,debug
    2024-01-28,19:39:38,0,0,0,0,0,1,0,0,0,0,1,0,1,52,34,0,157,10,34


    Le fait que le fichier soit défini comme .txt on peut l'exploiter comme un .csv ??


    Toine

  17. #17
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 060
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 060
    Par défaut
    txt ou csv c'est un fichier texte, la différence c'est que pour du csv on a un texte formaté spécifiquement pour séparer chaque donnée à l'aide d'un séparateur (virgule ou point virgule le plus souvent).

    Comme le fichier n'est pas traité par la suite (pour faire des graphiques, stats, etc.) je ne vois pas l'utilité de le nommer différemment que ceux pour quoi il est créé, c'est à dire lire du texte (avec l'extension txt).

    la sortie à l'air pas trop mal, à toi de voir le format de la date si tu veux modifier sous le format français %d/%m/%Y à la place de %Y-%m-%d

  18. #18
    Membre actif
    Homme Profil pro
    Aidant
    Inscrit en
    Janvier 2024
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Aidant
    Secteur : Services à domicile

    Informations forums :
    Inscription : Janvier 2024
    Messages : 55
    Par défaut
    Merci Fred,

    J'ai juste une ou deux questions supplémentaires, je vois que tu sais partager ton savoir et en tant que scientifique, ça me touche tout particulièrement...

    - Dans le fichier de données il est marqué au début "Date Heure " mais pas la vraie date en question.

    - Je compte bien faire des graphiques ensuite avec ces données donc pourquoi pas coder directement en .csv ?

    - Le fichier que ton script crée est dans le répertoire principal, je voudrais qu'il soit dans le dossier "/home/pi/Donnees_Chaudiere/Janvier2024" puis ensuite en février dans le dossier "/home/pi/Donnees_Chaudiere/Fevrier2024" etc,etc...

    Tu aurais une solution ?

    Merci d'avance
    Antoine

  19. #19
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 060
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 060
    Par défaut
    je vois que tu sais partager ton savoir et en tant que scientifique
    Il n'y a rien de scientifique dans ce que j'ai pu apporter comme réponse

    Dans le fichier de données il est marqué au début "Date Heure " mais pas la vraie date en question.
    C'est à dire ? As-tu lu ma réponse précédente concernant le format de la date ?

    Je compte bien faire des graphiques ensuite avec ces données donc pourquoi pas coder directement en .csv ?
    Ça change rien du peux garder en txt tout en utilisant le module csv pour le lire, mais si tu veux modifier de txt à csv c'est comme tu veux, ça ne changera rien pour la suite.

    Le fichier que ton script crée est dans le répertoire principal, je voudrais qu'il soit dans le dossier "/home/pi/Donnees_Chaudiere/Janvier2024"
    C'est là où ça serait peut-être le moment de comprendre mon code et essayer de se mettre un peu à python, voir du côté du module os, et comment créer un répertoire par exemple

  20. #20
    Membre actif
    Homme Profil pro
    Aidant
    Inscrit en
    Janvier 2024
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Aidant
    Secteur : Services à domicile

    Informations forums :
    Inscription : Janvier 2024
    Messages : 55
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Il n'y a rien de scientifique dans ce que j'ai pu apporter comme réponse
    J'ai dis ça car j'estime que le savoir est une chose qui doit être partagée, étant moi-même physicien j'ai eu la chance de passer de longues années d'études à apprendre un savoir et je suis toujours ravi d'en faire profiter les autres. C'est ce que tu as fait avec moi et je t'en remercie.

Discussions similaires

  1. Réponses: 6
    Dernier message: 14/06/2019, 13h23
  2. Comment enregistrer les images d'une page web ?
    Par Chris33 dans le forum Réseau/Web
    Réponses: 1
    Dernier message: 11/07/2006, 22h09
  3. [debutant] lister tout les mots d'une page web!
    Par kriskikout dans le forum Web
    Réponses: 20
    Dernier message: 31/05/2006, 22h47
  4. Site qui vérifie les actualisations d'une page web
    Par LFC dans le forum Autres langages pour le Web
    Réponses: 4
    Dernier message: 01/12/2005, 18h47
  5. Lire le contenu d'une page web grâce à un script PHP
    Par BloodyImp dans le forum Langage
    Réponses: 3
    Dernier message: 06/11/2005, 22h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo