Comment récupérer le texte d'un fichier html

lolonaute97 Messages postés 31 Statut Membre -  
ktm620enduro Messages postés 377 Statut Membre -
Bonjour,

Je veux récupérer une zone de texte de cette page: http://www.meteo.fr/temps/domtom/La_Reunion/EMD/orages/orages.html

JE veux récupérer ce texte:

Bulletin du 12/04/2011
'IL N'Y A PAS OU PLUS DE BULLETIN DE VIGILANCE ORAGES EN COURS'

Ce texte étant mis à jour tout le temps je ne peux pas m'amuser à faire copier coller.

Est ce possible avec iframe?

merci pour votre aide

6 réponses

  1. ktm620enduro Messages postés 377 Statut Membre 38
     
    en php ce type de programme se résume en deux lignes

    if (preg_match('#ffoooo">([^<]+)#i',file_get_contents('http://www.meteo.fr/temps/domtom/La_Reunion/EMD/orages/orages.html'),$r))   
    echo $r[1];   
    

    Abandonne ce qui te trouble au profit de ce qui apaise ton coeur.
    2
    1. heyquem Messages postés 808 Statut Membre 131
       
      Le code en Python peut évidemment s'écrire de façon plus condensée mais j'ai préféré détailler pour que ce soit plus lisible.
      La RE est aussi longue car elle est prévue pour pouvoir être modifiée afin d'attraper la date en rajoutant simplement deux parenthèses autour de \d\d/\d\d/20\d\d
      Le code suivant comporte ainsi findall() au lieu de search() dans la même optique.

      import re,urllib
      print re.findall('<font color="#FFOOOO">\n  (.+?)\n  </font>',
            urllib.urlopen('http://www.meteo.fr/temps/domtom/'
            'La_Reunion/EMD/orages/orages.html').read())[0]



      ktm620enduro, si je comprends bien, les regex et la fonction file_get_contents() sont disponibles de base dans PHP sans importation particulière ?
      0
    2. lolonaute97 Messages postés 31 Statut Membre
       
      Ton code marche super merci!
      0
    3. lolonaute97 Messages postés 31 Statut Membre
       
      Autre question: Comment faire pour qu'une image s'affiche en fonction de tel ou tel texte.

      Je m'explique quand il n'y a pas de vigilance je veux afficher une image verte (vert.jpg)

      Par contre dès qu'il y a une alerte l'image passe au rouge (rouge.jpg)

      Merci a vous!
      0
    4. ktm620enduro Messages postés 377 Statut Membre 38
       
      ben cette fois c'est un peu plus long.. lol
      preg_match('#ffoooo">([^<]+)#i',file_get_contents('http://www.meteo.fr/temps/domtom/La_Reunion/EMD/orages/orages.html'),$r);  
      if ($r[1]=='IL N\'Y A PAS OU PLUS DE BULLETIN DE VIGILANCE ORAGES EN COURS') echo '<img src="vert.jpg" >';  
      else echo '<img src="rouge.jpg" >';  
      
      0
    5. ktm620enduro Messages postés 377 Statut Membre 38
       
      salut heyquem , oui tout a fait les expressions rationnelles compatibles perl ; et les fonctions file get contents fread fwrite, sont disponibles d'office en php meme chez un hébergeur gratuit comme free.FR
      0
  2. ktm620enduro Messages postés 377 Statut Membre 38
     
    merci heyquem d'apporter des coups de mains pour résoudre ce sujet. Il me faudrai les 2 versions, avec et sans alerte afin de pouvoir déterminer la regex qui peut matcher les deux. Si tu peux me pondre les 2 versions en .html en faisant "enrgistrer sous" ca serai bien lolonaute97. A bientot, quand tu m'auras pondu ça je te sortirai le code qui fonctionne a touts les coups ;)
    1
    1. lolonaute97 Messages postés 31 Statut Membre
       
      IL Y A UNE ALERTE EN COURS. en ce moment tu peux avoir le code html de l'alerte sur http://www.meteo.fr/temps/domtom/La_Reunion/EMD/orages/orages.html
      Vas y avant demain matin 7h. heure de la réunion car l'alerte ne sera plus d'actualité demain.
      0
    2. ktm620enduro Messages postés 377 Statut Membre 38
       
      tu pourrais le faire stp car je ne suis pas chez moi actuellement... donc c'est pas facile de stocker quelquechose que je vais récupérer demain... ? merci...
      0
    3. heyquem Messages postés 808 Statut Membre 131
       
      Je viens d'enrgistrer le code source de la page actuelle avec bulletin complet.
      Le fichier fait 94639 octets.
      S'il faut vous l'envoyer , dites moi comment, c'est un peu lourd pour le mettre sur CCM

      Je ne fais pas 'Enregistrer sous' pour faire ce genre d'enregistrement , car je ne comprends pas bien ce qui se passe en coulisse.
      J'utilise un programme de 6 lignes pour capter le code source et l'enregistrer en mode binaire qui conserve intégralement tous les caractères.

      Je ne comprends pas bien : quelle est la difficulté pour enregistrer le code source d'une page web ?

      PS: je n'avais pas enregistré la page en l'absence de bulletin. Mais en reprenant mon code, il va être facile de progresser
      0
    4. ktm620enduro Messages postés 377 Statut Membre 38
       
      ok alors a demain pour la suite; quand on aura les deux versions ;)
      0
    5. heyquem Messages postés 808 Statut Membre 131
       
      Mais bon, ce n'est pas la peine d'attendre demain pour pouvoir écrire le code suivant:


      import re
      import urllib
      
      url = 'http://www.meteo.fr/temps/domtom/La_Reunion/EMD/orages/orages.html'
      
      sock = urllib.urlopen(url)
      ch = sock.read()
      sock.close()
      
      RE1 = ('  BULLETIN DE VIGILANCE ORAGES\n'
            "  </div>\n  <div id='references_preview'>\n"
            '    Bulletin du \d\d/\d\d/20\d\d\n'
            " <br>\n  </div>\n  <div id='texte_bulletin'>\n  <b>\n"
            '  <font color="#FFOOOO">\n'
            "  (.+?)\n"
            '  </font>\n  </b>\n  </div>\n    </body>\n    </html>')
      
      
      RE2 = ('  BULLETIN DE VIGILANCE ORAGES\n'
            "  </div>\n  <div id='references_preview'>\n"
            '    (Bulletin nº \d+ du \d\d/\d\d/20\d\d à \d\d h \d\d locales,)<br>\n'
            '    (valable du \d\d/\d\d/20\d\d\ à \d\d\ heures'
            ' au \d\d\/\d\d\/20\d\d à \d\d\ heures locales.)\n'
            '  </div>\n'
            "  <div id='texte_bulletin'>\n"
            '(.+?)'
      
            '<strong>ZONAGE DES RISQUES:</strong>(.+?)</div>\n'
      
            "<div id='carte_et_climato'>"
            '.+?'
      
            'h2>ZONAGE DU RISQUE</h2>'
            '(.+?)'
            "\n  </div>\n  <div id='preview_conseils'>\n")
      
      mat = re.search(RE1,ch)
      
      if mat:
          print mat.group(1)
      
      else:
          li =  re.search(RE2,ch,re.DOTALL).groups()
          print 'li[0] :\n',li[0]
          print
          print 'li[1] :\n',li[1]
          print
          print re.sub('</?p>','',li[2]).strip()
          print
          print 'li[3] :\n',li[3]
          print
          print re.findall('Risque d.+?(?=</p>)',li[3])
          print
          print 'li[4] :\n',li[4]
          print
          print re.findall('<br><b>(Zone.+?)(?=<br><b>|\Z)',li[4])
      0
  3. heyquem Messages postés 808 Statut Membre 131
     
    Bonjour,

    Quel langage de programmation utilises-tu ?

    Il faut capter le code source de la page en question et la parser avec un parseur ou l'analyser avec une regex, et tu extrais ainsi la portion que tu désires

    En Python, ça se fait en moins de deux
    0
    1. heyquem Messages postés 808 Statut Membre 131
       
      D'ailleurs, voilà, c'est fait:

      import re
      import urllib
      
      url = 'http://www.meteo.fr/temps/domtom/La_Reunion/EMD/orages/orages.html'
      
      sock = urllib.urlopen(url)
      ch = sock.read()
      sock.close()
      
      print '\n'.join(repr(line) for line in ch.splitlines(1))
      
      RE = ('  BULLETIN DE VIGILANCE ORAGES\n'
            "  </div>\n  <div id='references_preview'>\n"
            '    Bulletin du \d\d/\d\d/20\d\d\n'
            " <br>\n  </div>\n  <div id='texte_bulletin'>\n  <b>\n"
            '  <font color="#FFOOOO">\n'
            "  (.+?)\n"
            '  </font>\n  </b>\n  </div>\n    </body>\n    </html>')
      
      print
      print '\n===============================\n'
      print re.search(RE,ch).group(1)



      J'ai écrit la RE à partir de ce qu'il y a dans la page en question en ce moment.
      Il faudrait connaitre le contenu de la page en cas de bulletin pour adapter la regex à la capture des bulletins tels qu'ils sont présentés.

      Si tu as un enregistrement du code source effectué lorsqu'il y avait un bulletin, fais le moi parvenir à heyquem@gmail.com et je modifierai en cnséquence.

      Par la suite il sera possibvle d'ajouter une fréquence de consultation si ça t'intéresse, et même l'envoi d'une alerte sur des destinations particulières, mais cette dernière chose je ne sais pas faire pour le moment.

      Salut
      0
    2. lolonaute97 Messages postés 31 Statut Membre
       
      merci. J'utilise php. Quand il y a un bulletin il y a un texte d'une dizaine de lignes qui annonce la durée du bulletin, la date effective, la zone concernée et l'intensité.

      Merci en tout cas pour ton aide. Et j'attends ta réponse avec impatience...
      0
    3. heyquem Messages postés 808 Statut Membre 131
       
      Quelle réponse ?


      Si tu veux utiliser mon code, tu dois installer Python. Ca prend 10 minutes max.


      Si tu veux continuer avec PHP, il faut écrire un programme similaire dans ce langage. PHP permet d'utiliser les regex aussi. Quant à capter un code source sur le web, il doit bien pouvoir le faire.
      Certains te conseilleront aussi un parseur. A toi de voir.

      En t'adressant à un forum PHP, tu trouveras de l'aide. Si tu restes en PHP, je ne peux pas t'aider plus.
      0
    4. lolonaute97 Messages postés 31 Statut Membre
       
      Salut,

      Merci pour le code. par compte petit souci la page "http://www.meteo.fr/temps/domtom/La_Reunion/EMD/orages/orages.html" a été mis à jour et le texte ne s'affiche pas sur mon site.

      Comment merci a vous
      0
  4. ktm620enduro Messages postés 377 Statut Membre 38
     
    essaye ceci
    if (preg_match('#(<div id='titre_avis'>.*?)<div id='preview_conseils'>#i',file_get_contents('http://www.meteo.fr/temps/domtom/La_Reunion/EMD/orages/orages.html'),$r))    
    echo $r[1];   

    Abandonne ce qui te trouble au profit de ce qui apaise ton coeur.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. heyquem Messages postés 808 Statut Membre 131
     
    Bonjour,

    J'ai fait ce que j'avais dit qu'il faudrait faire dès qu'on aurait le contenu d'un vrai bulletin: adapter la regex pour capturer un bulletin réel.

    import re      
    import urllib      
    
    url = 'http://www.meteo.fr/temps/domtom/La_Reunion/EMD/orages/orages.html'      
    
    sock = urllib.urlopen(url)      
    ch = sock.read()      
    sock.close()      
    
    print '\n'.join(repr(line) for line in ch.splitlines(1))      
    print '\n\n===============================\n\n\n'      
    
    RE = ('  BULLETIN DE VIGILANCE ORAGES\n'      
          "  </div>\n  <div id='references_preview'>\n"      
          '    (Bulletin nº \d+ du \d\d/\d\d/20\d\d à \d\d h \d\d locales,)<br>\n'      
          '    (valable du \d\d/\d\d/20\d\d\ à \d\d\ heures'      
          ' au \d\d\/\d\d\/20\d\d à \d\d\ heures locales\.)\n'      
          '  </div>\n'      
          "  <div id='texte_bulletin'>\n"      
          '(.+?)'      
    
          '<strong>ZONAGE DES RISQUES:</strong>(.+?)</div>\n'      
    
          "<div id='carte_et_climato'>"      
          '.+?'      
    
          'h2>ZONAGE DU RISQUE</h2>'      
          '(.+?)'      
          "\n  </div>\n  <div id='preview_conseils'>\n")      
    
    li =  re.search(RE,ch,re.DOTALL).groups()      
    
    print 'li[0] :\n',li[0]      
    print      
    print 'li[1] :\n',li[1]      
    print      
    print re.sub('</?p>','',li[2]).strip()      
    print      
    print 'li[3] :\n',li[3]      
    print      
    print re.findall('Risque d.+?(?=</p>)',li[3])      
    print      
    print 'li[4] :\n',li[4]      
    print      
    print re.findall('<br><b>(Zone.+?)(?=<br><b>|\Z)',li[4])


    Le résultat de ce programme est

    li[0] :      
    Bulletin nº 3 du 15/04/2011 à 05 h 00 locales,      
    
    li[1] :      
    valable du 15/04/2011 à 05 heures au 15/04/2011 à 17 heures locales.      
    
    Sur La Réunion, le flux est orienté au Nord-Est, associé à une masse d'air humide et instable. Au cours de la nuit, des nuages se sont développés entre l'île Maurice et notre département. Ils ont abordé les côtes Nord-Est en milieu de nuit. Vers 1 heure, le tonnerre a été entendu. Ces orages peuvent intéresser l'île jusqu'en fin de journée de ce vendredi 15 avril 2011 et occasionner des précipitations, localement fortes.      
    
    li[3] :      
    <br /><br />Risque d'orages: Zones 1, 2, 3, 4 et 5 </p><p>Risque de fortes pluies: Zones 1, 2  </p>      
            
    
    ['Risque d'orages: Zones 1, 2, 3, 4 et 5 ', 'Risque de fortes pluies: Zones 1, 2  ']      
    
    li[4] :
    <br><b>Zone 1:</b> Risque d&#146;orages (probabilité 20 à 50%).<br><b>Zone 2:</b> Risque d&#146;orages (probabilité 20 à 50%).<br><b>Zone 3:</b> Risque d&#146;orages (probabilité 20 à 50%).<br><b>Zone 4:</b> Risque d&#146;orages (probabilité 20 à 50%).<br><b>Zone 5:</b> Risque d&#146;orages (probabilité 20 à 50%).
    
    ['Zone 1:</b> Risque d&#146;orages (probabilité 20 à 50%).', 'Zone 2:</b> Risque d&#146;orages (probabilité 20 à 50%).', 'Zone 3:</b> Risque d&#146;orages (probabilité 20 à 50%).', 'Zone 4:</b> Risque d&#146;orages (probabilité 20 à 50%).', 'Zone 5:</b> Risque d&#146;orages (probabilité 20 à 50%).']
    


    Dans les résultats , il faudrait changer toutes les séquences HTML du genre

     &agrave;  &icirc;  &eacute; etc.... 

    par des caractères accentués.
    Mais j'en reste là car je ne sais pas ce que tu veux faire exactement, et que de toutes façons tu utilises PHP. Alors je laisse la main à ktm620enduro.

    A titre indicatif, j'ai passé environ 1h pour arriver au code ci-dessus

    PS:

    l'image a pour adresse:

    http://www.meteo.fr/temps/domtom/La_Reunion/EMD/orages/CarteAlerteOrage.png
    0
  7. ktm620enduro Messages postés 377 Statut Membre 38
     
    salut je suis prêt pour te faire ton code, tu as les deux versions du fichier ?
    0
    1. heyquem Messages postés 808 Statut Membre 131
       
      Salut

      Problème. Le fichier que j'avais enregistré hier avec le code source du bulletin d'hier ne contient plus ce bulletin: j'ai fait la capture d'un autre code source et j'ai oublié de changer le nom du fichier de destination --> le précédent , avec le bulletin, a été effacé

      :(
      0
    2. ktm620enduro Messages postés 377 Statut Membre 38
       
      ca n'est pas le code de : http://www.meteo.fr/temps/domtom/La_Reunion/EMD/orages/orages.html ?
      0
    3. heyquem Messages postés 808 Statut Membre 131
       
      ben non, désolé

      cf mon post précédent que j'ai modifié
      0
    4. ktm620enduro Messages postés 377 Statut Membre 38
       
      c'est noté, on attend le prochain bulletin lol
      0