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 :

Récupération contenu "document.write" fichier html


Sujet :

Python

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Février 2011
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Récupération contenu "document.write" fichier html
    Bonjour,

    Afin de cibler le projet, voici quelques informations; J'ai développé un boitier se trouvant à l’extérieur qui récupère des informations en temps réel (par exemple, la température, tension batterie, etc..) puis transmet ces données à un boitier connecté au réseaux. Le boitier permet de mettre à disposition ces informations sur une petite page html actualisée toutes les secondes. Jusqu'ici, tout fonctionne.

    Maintenant, je souhaiterais récupérer ces informations toutes les minutes à l'aide d'un petit script python tournant en tache de fond.

    Le problème que je rencontre: Je parviens à récupéré la chaine de caractère de la page html par différents moyens (urllib/socket) mais les variables (températures etc..) ne sont pas affichées. J'obtiens une chaine de type "<td>Temps</td><td><script>document.write(Tps)</script>". Sur la page Html, la variable "document.write(Tps)" affiche par exemple "18", mais je n'arrive pas trouver la solution pour obtenir ces valeurs dans mon string récupéré via python.

    Ex de 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
    # -*- coding: cp1252 -*-
    import webbrowser
    import urllib
    import time
    import os
    import HTMLParser
     
    from HTMLParser import HTMLParser
    # create a subclass and override the handler methods
    class MyHTMLParser(HTMLParser):
        def handle_data(self, data):
            print data
     
    # instantiate the parser and fed it some HTML
    parser = MyHTMLParser()
     
    IP = 'http://172.26.4.1'
     
    print ('Récupération ' + IP)
    page=urllib.urlopen(IP)
    strpage=page. read()
    page.close()
    parser.feed(strpage)
    Ce qu'il me renvoi:

    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
    Récupération http://172.26.4.1
    Recharger - (automatique)
    Requetes http = 
    document.write(REQ)
    Informations
    Cycles A
    document.write(CyA)
    Cycles B
    document.write(CyB)
    Defauts
    document.write(Def)
    Fuel (L)
    document.write(Fue)
    Temps
    document.write(Tps)
    Etat syst
    document.write(Eta)
    Defaut statut
    str="";for(i=0;i<8;i++){str+="<tr><td bgcolor=pink>Defaut #"+i+"</td>";if(defAffich&(1<<i)){str+="<td bgcolor=red>Err";}else {str+="<td bgcolor=green>OK";}str+="</td></tr>";}document.write(str) ;
    Ma question: Avez-vous une idée/solution pour récupérer les valeurs contenus dans les variables "document.write(xx)" de la page?

    Merci pour votre aide.

  2. #2
    Expert éminent

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Points : 8 442
    Points
    8 442
    Par défaut
    Bonjour franck.choloux,

    Je me pose une question en lisant ton post: pourquoi, quand tu récupères le code de la page HTML, n'as tu pas les valeurs numeriques? Je me demande aussi, pourquoi la reponse qui t'es renvoyée ressemble à du langage C sur la fin?

    Pourrais tu nous détailler un peu plus en détail la façon dont est géré ton HTML côté cible? A première vue, je pense que le soucis est plutôt à ce niveau. EN effet, ta cible génère une page HTML. Mais un navigateur et ton code n'interroge pas forcément la cible de la même façon.
    "La connaissance appartient à tout le monde" (Film Antitrust)

    Tout le nécessaire pour Python:
    *News/Accueil *Cours/tutoriels *FAQ
    *Forums *Outils dédiés *Mon espace personnel avec mes Articles, Cours et Tutoriels

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Février 2011
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Bonjour deusyss, et merci pour ta réponse.

    Je parviens à récupérer les valeurs numériques codé en dure.
    Effectivement tu as bien vu pour le C.

    En fait la carte électronique connecté sur le réseaux comporte un micro-controleur (PIC de microchip) qui est programmé en C.

    Pour rentrer dans les détails, il y a une base "html" dans le code C en dure, avec des variables changeantes entourées de balises <script>document.write(maVariable)</script>.
    maVariable varie plus loin dans le code dans une chaine afin de permettre une réponse "dynamique". C'est peut être le problème.

    Je n'ai pas le code exact sur ce PC, je le mettrai dés demain pour apporter plus d'idées.

  4. #4
    Expert éminent

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Points : 8 442
    Points
    8 442
    Par défaut
    Bonjour,

    Je connais bien ces microcontroleurs, étant un ancien expert sur ces puces. Bref, je voit un peu mieux le principe. D'autre question viennet à moi en lisant ta réponse: Utilise tu un PIC avec interface ethernet intégré ou un pont serie/ethernet (ça c'est pour ma curiosité personnelle )?

    Comment ta page est-elle mise à disposition des clients web? ta page est-elle créée dynamiquement à chaque requête, ou bien générée en statique (1/s si j'ai bien compris), puis transmise à chaque requête? J'ai vu que tu avait indiqué dynamique, mais je prefere lever l'ambiguité pour t'aider au mieux: cela peut être dynamique tel que je l'ai indiqué, ou dynamique dans le sens ou les valeurs des capteurs fluctuent et sont mises à jour.

    Je pose la question car pour moi ton anomalie semble indiquer le premier cas. Tu ne semble pas récupérer le code HTML final de ta page web, mais le code permettant de générer ta page web.

    Si le fichier HTML était généré chaque seconde puis mis à disposition, tu disposerais alors d'un fichier avec les valeurs codées en dur dans ton code HTML. Ce serais alors ce code qu'il faudrait transmettre aussi bien à un navigateur que lors d'un interrogation reseau. Et en le parsant tu ne devrais alors plus avoir d'erreur.

    J'espère avoir été clair, car j'ai un petit doute . Si quelque chose ne te parait pas clair, n'hesite pas à me le dire, je tacherais de m'exprimer differemment.
    "La connaissance appartient à tout le monde" (Film Antitrust)

    Tout le nécessaire pour Python:
    *News/Accueil *Cours/tutoriels *FAQ
    *Forums *Outils dédiés *Mon espace personnel avec mes Articles, Cours et Tutoriels

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Février 2011
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Je suis parti d'une base assez connue sur ce PCB, un PIC18F22K60 qui communique avec un ENC28J60 (via SPI).

    Effectivement, elle doit être généré en statique en actualisant les variables de la page car je récupère caractère pour caractère le contenu html permettant de générer la page web.

    Je vais donc essayer de changer le code par une méthode différente. Comme tu l'a dis, il faut en gros mettre en "dure" les valeurs et les envoyer, même si je n'ai pas encore d'idée pour faire cela en html/C.

    En tout cas tu as, je pense, bien cibler le problème. Je vais me pencher dessus et essayer de le mettre en application. Merci deusyss.

  6. #6
    Membre éprouvé Avatar de Marc3001
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2008
    Messages
    829
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2008
    Messages : 829
    Points : 1 275
    Points
    1 275
    Par défaut
    Je ne sais pas où vous voyez du C, moi je vois une page HTML contenant du javascript.

    Il aurait été d'ailleurs bizarre de récupérer du code C dans ta page alors que tu la récupères en HTTP....

    Il faudrait que tu envoies le code complet de la page HTML reçue car il y a 2 choix :
    - Les valeurs sont dans le code javascript de ta page. Il suffit de retrouver les lignes qui valorisent les variables (Tps, Fue,...) plutot que la valeur des cellules du tableau.
    - La page HTML n'est jamais modifiées mais le javascript lui va chercher les infos en AJAX. Avec un peu de chance, ça renvoie du JSON. Dans ce cas, il ne faut pas aller chercher la page HTML mais directement le JSON qui sera bien plus facile à parser car ne contenant que les infos interressantes.
    Le logiciel, c'est comme le sexe, c'est meilleur quand c'est libre.

    Linus Torvalds

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Février 2011
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Bonjour Marc3001,

    voici le code HTML brut que je reçois (contenant des blocs en C):

    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
    <meta http-equiv="refresh" content="3;url=http://172.26.4.1">
    <HTML><HEAD></HEAD><BODY>
    <IMG SRC="http://upload.wikimedia.org/wikipedia/fr/5/55/Developpez.gif"><h1>Endurance test</h1>
    <a href=/>Recharger - (automatique)</a>
    <script src=/s></script><br>Requetes http = <script>document.write(REQ)</script>
    <br>Contact: <A HREF="mailto:f.choloux@xxxx">f.choloux</A><br>DEP: <A HREF="http://172.17.1.10:10010/bin/home.html">12501</A><br>
    <br><table><tr><td valign=top><table border=1 style="font-size:20px ;font-family: terminal ;"><tr><th colspan=2>Informations</th></tr>
    <tr><td>Cycles A</td><td><script>document.write(CyA)</script></td></tr>
    <tr><td>Cycles B</td><td><script>document.write(CyB)</script></td></tr>
    <tr><td>Defauts</td><td><script>document.write(Def)</script></td></tr>
    <tr><td>Fuel (L)</td><td><script>document.write(Fue)</script></td></tr>
    <tr><td>Temps</td><td><script>document.write(Tps)</script></td></tr>
    <tr><td>Etat syst</td><td><script>document.write(Eta)</script></td></tr>
    </table></td><td valign=top><table border=1 style="font-size:20px ;font-family: terminal ;">
    <tr><th colspan=2>Defaut statut</th></tr><script>str="";for(i=0;i<8;i++){str+="<tr><td bgcolor=pink>Defaut #"+i+"</td>";if(defAffich&(1<<i)){str+="<td bgcolor=red>Err";}else {str+="<td bgcolor=green>OK";}str+="</td></tr>";}document.write(str) ;
    </script></table></td></tr></table></BODY></HTML>
    Et voici quatre parties du code en C dans le micro:
    1/Contenu HTML

    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
    //ROM constant strings
    const unsigned char httpHeader[] = "HTTP/1.1 200 OK\nContent-type: ";  // HTTP header
    const unsigned char httpMimeTypeHTML[] = "text/html\n\n";              // HTML MIME type
    const unsigned char httpMimeTypeScript[] = "text/plain\n\n";           // TEXT MIME type
    unsigned char httpMethod[] = "GET /";
    bit OnOff;
     
    const   char    *indexPage =                   
    "<meta http-equiv=\"refresh\" content=\"3;url=http://172.26.4.1\">\
    <HTML><HEAD></HEAD><BODY>\
    <IMG SRC=\"http://upload.wikimedia.org/wikipedia/fr/5/55/Developpez.gif\">\
    <h1>Endurance test</h1>\
    <a href=/>Recharger - (automatique)</a>\
    <script src=/s></script>\
    <br>\
    Requetes http = <script>document.write(REQ)</script>\
    <br>\
    Contact: <A HREF=\"mailto:f.choloux@xxxx\">f.choloux</A>\
    <br>\
    DEP: <A HREF=\"http://172.17.1.10:10010/bin/home.html\">12501</A>\
    <br>\
    <br>\
    <table><tr><td valign=top><table border=1 style=\"font-size:20px ;font-family: terminal ;\">\
    <tr><th colspan=2>Informations</th></tr>\
    <tr><td>Cycles A</td><td><script>document.write(CyA)</script></td></tr>\
    <tr><td>Cycles B</td><td><script>document.write(CyB)</script></td></tr>\
    <tr><td>Defauts</td><td><script>document.write(Def)</script></td></tr>\
    <tr><td>Fuel (L)</td><td><script>document.write(Fue)</script></td></tr>\
    <tr><td>Temps</td><td><script>document.write(Tps)</script></td></tr>\
    <tr><td>Etat syst</td><td><script>document.write(Eta)</script></td></tr>\
    </table></td><td valign=top><table border=1 style=\"font-size:20px ;font-family: terminal ;\">\
    <tr><th colspan=2>Defaut statut</th></tr>\
    <script>\
    str=\"\";\
    for(i=0;i<8;i++)\
    {str+=\"<tr><td bgcolor=pink>Defaut #\"+i+\"</td>\";\
    if(defAffich&(1<<i)){str+=\"<td bgcolor=red>Err\";}\
    else {str+=\"<td bgcolor=green>OK\";}\
    str+=\"</td></tr>\";}\
    document.write(str) ;\
    </script>\
    </table></td></tr></table>\
    </BODY></HTML>\
    " ;
    2/Variables buffer etc.;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    unsigned char   getRequest[15];         // HTTP request buffer
    unsigned char   dyna[80];                  // buffer - dynamic response
    unsigned long   httpCounter = 0;         // counter of HTTP requests
    3/Changement du contenu des variables dans une chaine de caractère:

    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
      // add Cycle A value to reply
        LongToStr(CycleA, dyna) ;
        len += putConstString("var CyA=") ;
        len += putString(dyna) ;
        len += putConstString(";") ;
     
        // add Cycle B value to reply
        LongToStr(CycleB, dyna) ;
        len += putConstString("var CyB=") ;
        len += putString(dyna) ;
        len += putConstString(";") ;
     
        // add defauts value to reply
        intToStr(defauts, dyna) ;
        len += putConstString("var Def=") ;
        len += putString("'");
        len += putString(dyna);
        len += putString("'");
        len += putConstString(";") ;
    4/Constitution page html:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(len == 0) {                              
        len =  putConstString(httpHeader) ;            // HTTP header
        len += putConstString(httpMimeTypeHTML);  // HTML MIME type
        len += putConstString(indexPage) ;             // HTML page 1
       }

  8. #8
    Membre éprouvé Avatar de Marc3001
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2008
    Messages
    829
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2008
    Messages : 829
    Points : 1 275
    Points
    1 275
    Par défaut
    Citation Envoyé par franck.choloux Voir le message
    voici le code HTML brut que je reçois (contenant des blocs en C)
    Ah mais non.... Je vous dis que c'est pas du C. C'est du javascript....

    Enfin bon, le morceau intéressant c'est Tu pourrais essayer de récupérer le fichier http://172.26.4.1/s

    Logiquement, vu que dans le code C qui valorise les variables, ça ressemble à la création d'un fichier javascript avec les initialisations de variable, tu devrais retrouver dans ce fichier toutes tes valeurs.
    Le logiciel, c'est comme le sexe, c'est meilleur quand c'est libre.

    Linus Torvalds

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Février 2011
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Tout simplement impeccable!!

    J'allais modifier tout le code C mais finalement le /s "pointe" directement sur la chaine (dyna) qui contient les variables. Donc du javaScript! Je te fais confiance

    Cela fonctionne très bien, je récupère les valeurs qui m'intéressent directement.

    Merci beaucoup
    pour cet analyse Marc!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 22/01/2008, 10h33
  2. Réponses: 7
    Dernier message: 08/07/2004, 14h47
  3. Réponses: 12
    Dernier message: 03/06/2004, 20h21

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