Extraction d'une chaine

Extraction d'une chaine - Perl - Programmation

Marsh Posté le 12-09-2005 à 09:34:04    

Bonjour à tous !
 
Voila, je cherche a extraire une chaine de caractères dans un fichier. (nombre d'annonce d'un site)
 
Extrait de mon fichier qui est en html :
 
                        <div class="NbAnnonces" style="padding-top:10px;"> <font color="#2E2C6B">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Aujourd'hui  
                          : <span class="NbAnnonces02"><font color="#2E2C6B">6 541</font></span>&nbsp;annonces</font></div>
                        <br>
 
dans ce cas je souhaite extraire le chiffre 6 541
 
J'en appelle à vos pouvoirs car j'y arrive pas, je liste bien mon fichier mais après :pt1cable:  
 
merci

Reply

Marsh Posté le 12-09-2005 à 09:34:04   

Reply

Marsh Posté le 12-09-2005 à 09:40:41    


grep NbAnnonces02 fichier.html | sed -re 's/.*>([0-9 ]+)<.*/\1/'


 
 
[edit]
Merde c'est du perl :/ bon je passe ... mais la regexp devrait être bonne aussi


Message édité par 0x90 le 12-09-2005 à 09:41:15

---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 12-09-2005 à 10:01:34    

La regexp est presque identique, oui, dans la second partie du s/// il faut remplacer 1 par $1 pour que ça fonctionne en PERL.

Reply

Marsh Posté le 12-09-2005 à 10:13:39    

Merci pour vos réponses rapides !
 
Excuser mon ignorance mais comment faut-il s'en servir ? J'avais commencé par ouvrir le fichier, essayé de trouvé la chaine, puis fermer mon fichier.
 
Ce code fait-il tout ça ?
 

Code :
  1. grep NbAnnonces02 fichier.html | sed -re 's/.*>([0-9 ]+)<.*/$1/'


 
J'ai essayé mais j'obtiens ca :
 
String found where operator expected at C:\wget\test2.pl line 2, near "re 's/.*>
([0-9 ]+)<.*/$1/'"
        (Do you need to predeclare re?)
Not enough arguments for index at C:\wget\test2.pl line 2, near "index."
syntax error at C:\wget\test2.pl line 2, near "re 's/.*>([0-9 ]+)<.*/$1/'"
Execution of C:\wget\test2.pl aborted due to compilation errors.
 
merci encore

Reply

Marsh Posté le 12-09-2005 à 10:14:58    

C'est pas du perl que je t'ai passé, c'est une commande bash sous nux, te faudra chercher un peu plus et connaitre le perl pour arriver à tes fins.


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 12-09-2005 à 10:16:45    

Non, il t'a donné une commande shell, il avait mal lu l'énoncé (il l'a dit).
 
Pour utiliser des regexp :
http://perldoc.perl.org/perlre.html
 
Et pour une réponse plus précise, il va te falloir poster le morceau ad hoc de ton code, là comme ça je ne vois pas comment t'aider.


Message édité par Elmoricq le 12-09-2005 à 10:17:19
Reply

Marsh Posté le 12-09-2005 à 10:25:29    

Elmoricq a écrit :

Non, il t'a donné une commande shell, il avait mal lu l'énoncé (il l'a dit).
 
Pour utiliser des regexp :
http://perldoc.perl.org/perlre.html
 
Et pour une réponse plus précise, il va te falloir poster le morceau ad hoc de ton code, là comme ça je ne vois pas comment t'aider.


 
merci, j'y jette un oeil. Pour préciser mon idée, je récupère un fichier index.html qui vient d'un site web. Dans ce fichier se trouve l'information (nombre d'annonce) que je souhaite extraire.
 
Cette extraction doit se faire dans cette partie :
 
<div class="NbAnnonces" style="padding-top:10px;"> <font color="#2E2C6B">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Aujourd'hui  
                          : <span class="NbAnnonces02"><font color="#2E2C6B">6 541</font></span>&nbsp;annonces</font></div>  
                        <br>  
 

 
dans ce cas je souhaite extraire le chiffre 6 541  
 
J'ai commencé mon script perl en ouvrant le fichier "index.html" mais la ou je bloque c'est dans la recherche de ce "nombre d'annonce"
 
Tu comprends mon besoin ?  
 
merci

Reply

Marsh Posté le 12-09-2005 à 10:29:58    

Montre ton code.

Reply

Marsh Posté le 12-09-2005 à 10:35:14    

Elmoricq a écrit :

Montre ton code.


Code :
  1. #!c:\perl\perl.exe
  2. open (fichier,"index.html" );
  3. while (my $ligne =<fichier> ){
  4.   if ($ligne =  #je cherche le nombre d'annonce
  5.     print $ligne;
  6. }
  7. close fichier;


 
ca va t'aider  :(

Reply

Marsh Posté le 12-09-2005 à 10:58:04    

jerph a écrit :

ca va t'aider  :(


 
Oui, c'est bien plus facile pour te montrer comment ça marche :
 

Code :
  1. #!c:\perl\perl.exe
  2. use strict;
  3. # Convention : les identifiants de fichier sont en majuscule
  4. open (FICHIER,"index.html" )
  5.     or die "Echec ouverture de 'index.html' : $!";
  6. foreach my $ligne ( <FICHIER> )
  7. {
  8.     chomp $ligne;
  9.     # petite amélioration de la regexp pour ne pas prendre les
  10.     # balises qui ne comportent qu'un espace, sans chiffre
  11.     print "$ligne\\n" if ( $ligne =~ s/.*>(\\d+\\s*\\d+)<.*/$1/ );
  12. }
  13. close FICHIER;


Message édité par Elmoricq le 12-09-2005 à 11:04:47
Reply

Marsh Posté le 12-09-2005 à 10:58:04   

Reply

Marsh Posté le 12-09-2005 à 12:00:37    

merci Elmoricq
 
ton script fonctionne sur le bout de code que tu avais mais y'a quelquechose qui ne correspond pas aux lignes d'origine car sur mon fichier index.html ca ne marche pas. Peut-être que ca vient de ma façon d'avoir poster ce morceau dans le forum :
 
je recommence différemment :
 

Code :
  1. <div class="NbAnnonces" style="padding-top:10px;"> <font color="#2E2C6B">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Aujourd'hui
  2.                           : <span class="NbAnnonces02"><font color="#2E2C6B">6 541</font></span>&nbsp;annonces</font></div>
  3.                         <br>


 
Pour ma culture, peux-tu m'expliquer ta regexp  
 
merci encore

Reply

Marsh Posté le 12-09-2005 à 12:09:46    

jerph a écrit :

je recommence différemment :


 
Ca marche pareil. [:spamafote]
 

jerph a écrit :

Pour ma culture, peux-tu m'expliquer ta regexp


 
Le souci est que cette expression régulière fait appel à plusieurs notions qu'il serait assez long à expliquer ici, notament sur la "gourmandise" du moteur de regexp.
 
Je t'encourage à lire la documentation que je t'ai donnée en lien, si tu veux vraiment comprendre en profondeur comment ça fonctionne.
 
Sinon, en gros, ça ne conserve dans une ligne que le pattern décrit entre parenthèses de la regexp.  
Et ce pattern cherche la première occurence dans la ligne de : "au moins (+) un chiffre (\d), suivi de 0 ou plus (*) d'espaces (\s), suivis d'au moins (+) un chiffre (\d), le tout compris entre des caractères '>' et '<' ".


Message édité par Elmoricq le 12-09-2005 à 12:11:34
Reply

Marsh Posté le 12-09-2005 à 14:50:40    

Merci pour tes explications c'est plus claire.
 
J'ai toujours le soucis avec le fichier brut html.
 
J'ai rajouté un  

Code :
  1. print $ligne;


 
et voici ce qu'il affiche :
 

Code :
  1. </table>                        <div class="NbAnnonces" style="padding-top:10px;"> <font color="#2E2C6
  2. B">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Aujourd'hui                           : <span class="NbAnnonces0
  3. 2"><font color="#2E2C6B">6á053</font></span>&nbsp;annonces</font></div>                        <br>


 
 
ce ne serait pas un espace mais un á
j'ai donc essayé de modifier la regexp  en remplaçant s par w
 

Code :
  1. print "$ligne\n" if ( $ligne =~ s/.*>(\d+\w*\d+)<.*/$1/ );


 
mais pas mieux ...


Message édité par jerph le 12-09-2005 à 15:06:32
Reply

Marsh Posté le 12-09-2005 à 14:53:19    

Bizarre ce caractère. Essaie de remplacer "\w*" par "." (un point, tout seul, tout bête).

Reply

Marsh Posté le 12-09-2005 à 15:16:17    

rien de neuf :
 
j'ai essayé ça :
 

Code :
  1. use strict;
  2. # Convention : les identifiants de fichier sont en majuscule
  3. open (FICHIER,"index.html" )
  4.     or die "Echec ouverture de 'index.html' : $!";
  5. foreach my $ligne ( <FICHIER> )
  6. {
  7.     chomp $ligne;
  8. print "$ligne/ligne\n";
  9.     # petite amélioration de la regexp pour ne pas prendre les
  10.     # balises qui ne comportent qu'un espace, sans chiffre
  11.    print "$ligne\n" if ( $ligne =~ s/.*>(\d+\.\d+)<.*/$1/ );
  12. }
  13. close FICHIER;


 
ce qui me permet de voir ce qui est considéré comme ligne.
 
résultat :
 

Code :
  1. <div class="NbAnnonces" style="padding-top:10px;"> <font color="#2E2C6B">&nbsp;&nbsp;&nbsp;
  2. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Aujourd'hui /ligne
  3.                           : <span class="NbAnnonces02"><font color="#2E2C6B">6á053</font></span>&nbsp;annonces</fon
  4. t></div>/ligne
  5.                         <br>/ligne


 
j'en déduit que la recherche est effective sur :
 

Code :
  1. : <span class="NbAnnonces02"><font color="#2E2C6B">6á053</font></span>&nbsp;annonces</fon
  2. t></div>


 
 
J'ai essayé ca aussi, avec \w+ il devrait me trouver 6á053 non ? :
 

Code :
  1. print "$ligne\n" if ( $ligne =~ s/.*>(\w+)<.*/$1/ );


 
merci encore


Message édité par jerph le 12-09-2005 à 15:20:20
Reply

Marsh Posté le 12-09-2005 à 17:16:48    

bon du nouveau :
 
avec ca :  
 
if ( $ligne =~ s/.*>(\d+\W\d+)<.*/$1/ )  
 
j'affiche :
 
6á053
 
maintenant j'essai de supprimer le caractére "á" dans la chaine  :pt1cable:

Reply

Marsh Posté le 12-09-2005 à 17:29:12    

if ( $ligne =~ s/.*>(\\d+)\\W(\\d+)<.*/$1$2/ )  


Message édité par Elmoricq le 12-09-2005 à 17:30:10
Reply

Marsh Posté le 12-09-2005 à 17:36:59    

Elmoricq a écrit :

if ( $ligne =~ s/.*>(\\d+)\\W(\\d+)<.*/$1$2/ )  



 
 
 :bounce: Ca marche !
 
Ouf ! merci bien, j'en ai lu de la doc aujourd'hui, j'ai la tête  :pt1cable: , heureusement que c'est un besoin perso car j'suis pas doué dans le code ;)  
 
merci encore pour ta patience et ta disponibilité

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed