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

lolonaute97 Messages postés 27 Date d'inscription   Statut Membre Dernière intervention   -  
ktm620enduro Messages postés 293 Date d'inscription   Statut Membre Dernière intervention   -
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
A voir également:

6 réponses

ktm620enduro Messages postés 293 Date d'inscription   Statut Membre Dernière intervention   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
heyquem Messages postés 759 Date d'inscription   Statut Membre Dernière intervention   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
lolonaute97 Messages postés 27 Date d'inscription   Statut Membre Dernière intervention  
 
Ton code marche super merci!
0
lolonaute97 Messages postés 27 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   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
ktm620enduro Messages postés 293 Date d'inscription   Statut Membre Dernière intervention   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
ktm620enduro Messages postés 293 Date d'inscription   Statut Membre Dernière intervention   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
lolonaute97 Messages postés 27 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   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
heyquem Messages postés 759 Date d'inscription   Statut Membre Dernière intervention   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
ktm620enduro Messages postés 293 Date d'inscription   Statut Membre Dernière intervention   38
 
ok alors a demain pour la suite; quand on aura les deux versions ;)
0
heyquem Messages postés 759 Date d'inscription   Statut Membre Dernière intervention   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
heyquem Messages postés 759 Date d'inscription   Statut Membre Dernière intervention   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
heyquem Messages postés 759 Date d'inscription   Statut Membre Dernière intervention   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
lolonaute97 Messages postés 27 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   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
lolonaute97 Messages postés 27 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   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

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

Posez votre question
heyquem Messages postés 759 Date d'inscription   Statut Membre Dernière intervention   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
ktm620enduro Messages postés 293 Date d'inscription   Statut Membre Dernière intervention   38
 
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   Statut Membre Dernière intervention   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
ktm620enduro Messages postés 293 Date d'inscription   Statut Membre Dernière intervention   38
 
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   Statut Membre Dernière intervention   131
 
ben non, désolé

cf mon post précédent que j'ai modifié
0
ktm620enduro Messages postés 293 Date d'inscription   Statut Membre Dernière intervention   38
 
c'est noté, on attend le prochain bulletin lol
0