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

Fermé
lolonaute97 Messages postés 27 Date d'inscription samedi 26 mars 2011 Statut Membre Dernière intervention 14 janvier 2012 - 12 avril 2011 à 19:01
ktm620enduro Messages postés 293 Date d'inscription mardi 21 septembre 2010 Statut Membre Dernière intervention 12 mars 2013 - 16 avril 2011 à 19:00
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

ktm620enduro Messages postés 293 Date d'inscription mardi 21 septembre 2010 Statut Membre Dernière intervention 12 mars 2013 38
Modifié par ktm620enduro le 13/04/2011 à 16:42
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
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
13 avril 2011 à 18:53
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
lolonaute97 Messages postés 27 Date d'inscription samedi 26 mars 2011 Statut Membre Dernière intervention 14 janvier 2012
14 avril 2011 à 06:17
Ton code marche super merci!
0
lolonaute97 Messages postés 27 Date d'inscription samedi 26 mars 2011 Statut Membre Dernière intervention 14 janvier 2012
14 avril 2011 à 08:16
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
ktm620enduro Messages postés 293 Date d'inscription mardi 21 septembre 2010 Statut Membre Dernière intervention 12 mars 2013 38
Modifié par ktm620enduro le 14/04/2011 à 14:28
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
ktm620enduro Messages postés 293 Date d'inscription mardi 21 septembre 2010 Statut Membre Dernière intervention 12 mars 2013 38
Modifié par ktm620enduro le 14/04/2011 à 14:23
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
ktm620enduro Messages postés 293 Date d'inscription mardi 21 septembre 2010 Statut Membre Dernière intervention 12 mars 2013 38
15 avril 2011 à 14:46
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
lolonaute97 Messages postés 27 Date d'inscription samedi 26 mars 2011 Statut Membre Dernière intervention 14 janvier 2012
15 avril 2011 à 14:58
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
ktm620enduro Messages postés 293 Date d'inscription mardi 21 septembre 2010 Statut Membre Dernière intervention 12 mars 2013 38
15 avril 2011 à 15:01
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
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
Modifié par heyquem le 15/04/2011 à 15:27
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
ktm620enduro Messages postés 293 Date d'inscription mardi 21 septembre 2010 Statut Membre Dernière intervention 12 mars 2013 38
15 avril 2011 à 15:36
ok alors a demain pour la suite; quand on aura les deux versions ;)
0
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
15 avril 2011 à 15:38
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
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
12 avril 2011 à 19:58
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
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
12 avril 2011 à 20:19
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
lolonaute97 Messages postés 27 Date d'inscription samedi 26 mars 2011 Statut Membre Dernière intervention 14 janvier 2012
13 avril 2011 à 12:00
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
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
13 avril 2011 à 15:05
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
lolonaute97 Messages postés 27 Date d'inscription samedi 26 mars 2011 Statut Membre Dernière intervention 14 janvier 2012
15 avril 2011 à 05:51
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
ktm620enduro Messages postés 293 Date d'inscription mardi 21 septembre 2010 Statut Membre Dernière intervention 12 mars 2013 38
Modifié par ktm620enduro le 15/04/2011 à 11:15
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
Modifié par heyquem le 15/04/2011 à 14:34
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
ktm620enduro Messages postés 293 Date d'inscription mardi 21 septembre 2010 Statut Membre Dernière intervention 12 mars 2013 38
Modifié par ktm620enduro le 16/04/2011 à 18:46
salut je suis prêt pour te faire ton code, tu as les deux versions du fichier ?
0
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
Modifié par heyquem le 16/04/2011 à 18:57
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
ktm620enduro Messages postés 293 Date d'inscription mardi 21 septembre 2010 Statut Membre Dernière intervention 12 mars 2013 38
16 avril 2011 à 18:53
ca n'est pas le code de : http://www.meteo.fr/temps/domtom/La_Reunion/EMD/orages/orages.html ?
0
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
16 avril 2011 à 18:59
ben non, désolé

cf mon post précédent que j'ai modifié
0
ktm620enduro Messages postés 293 Date d'inscription mardi 21 septembre 2010 Statut Membre Dernière intervention 12 mars 2013 38
16 avril 2011 à 19:00
c'est noté, on attend le prochain bulletin lol
0