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

Langage Perl Discussion :

Débutant heurte sa premiere regexp.


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 6
    Par défaut Débutant heurte sa premiere regexp.
    Bon(jour|soir)!
    Je dois parcourir un site web pour y retirer des informations sur des bouquins, (auteur, editeur, commentaire etc...). Je m appuis sur le fait que le source du site utilise une feuille de style aux classes judicieusements nommées (auteur, &eacute;diteur, etc...). Tous ces items peuvent eventuellement etre sur plusieurs lignes la fin de chaque item etant signalée soit par un </td> soit par un </span>, je vois assez bien comment me debrouiller avec ce probleme (de lignes), pour l instant, j essaie juste de recuperer la premiere ligne, debarassée de l eventuel indicateur de fin, j ai donc lié ma ligne a l expression reguliere suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $line=~ m[class="(titre|auteur|&eacute;diteur|texte|format)">(.*)(<(/td|/span)>)?]
    Le probleme est que suite a cela, les $3 et $4 sont toujours vides, mangés par le $2.
    J ai essayé differentes combinaisons de quantificateurs, sans succés (certaines combinaisons ayant d ailleurs eu des comportement auxquels je ne m attendais pas du tout en imaginant le resultat !).
    Auriez vous une idée pour que le $2 contienne tout le texte jusqu a une (eventuelle !!!) balise </td> ou </span> ?

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Par défaut
    .* est dit greedy (gourmand) : il consomme tout jusqu'à la fin.
    Ce qu'il te faut ici c'est un .*? (plutot .+? sans doute d'ailleurs) qui va stopper des qui trouvera la suite de ton motif.
    Niveau efficaciter, pour eviter que le moteur regexp ne fasse pleins d'assertions, il vaut mieux lui dire ce qu'il doit matcher plutot que ce jusqu'à quoi il doit matcher.
    Par exemple dans ton cas tu peux remplacer .+? par [^<]+ (a moins que tes données soit suceptibles de contenir d'autres tags, ou des données non echappées?...)

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 6
    Par défaut
    Merci pospos, pour ta reponse, cependant, et en commancant par la fin :
    1) Oui le texte est susceptible de contenir des balises genre <br>
    2) J ai tenté (.*?) ainsi que (.+?) avant de poster et ce sont les comportements que je n ai pas compris (j en parle dans le 1er post, sans les citer) :
    • (.*?) fait que tous les $n sauf $1 sont vides !
    • (.+?) fait que $2 contient toujours la premiere lette du texte, laissant $3, $4 vides !

    Donc ca ne repond pas a mon probleme !

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Par défaut
    Salut,
    Citation Envoyé par baygon_vert
    Merci pospos, pour ta reponse, cependant, et en commancant par la fin :
    1) Oui le texte est susceptible de contenir des balises genre <br>
    2) J ai tenté (.*?) ainsi que (.+?) avant de poster et ce sont les comportements que je n ai pas compris (j en parle dans le 1er post, sans les citer) :
    • (.*?) fait que tous les $n sauf $1 sont vides !
    • (.+?) fait que $2 contient toujours la premiere lette du texte, laissant $3, $4 vides !

    Donc ca ne repond pas a mon probleme !
    Tu veux mettre quelque lines ici pour tester? Ca sera mieux pour trouver quoi réponds à ton problème

    lami20j

  5. #5
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Citation Envoyé par baygon_vert
    Merci pospos, pour ta reponse, cependant, et en commancant par la fin :
    1) Oui le texte est susceptible de contenir des balises genre <br>
    2) J ai tenté (.*?) ainsi que (.+?) avant de poster et ce sont les comportements que je n ai pas compris (j en parle dans le 1er post, sans les citer) :
    • (.*?) fait que tous les $n sauf $1 sont vides !
    • (.+?) fait que $2 contient toujours la premiere lette du texte, laissant $3, $4 vides !

    Donc ca ne repond pas a mon probleme !
    C'est parce que tu marques ton (<(/td|/span)>) comme optionnel (avec ?)... *? et +? essaie toujours d'en matcher un minimum tout en satisfaisant la regex, donc ici il leur suffit de matcher rien ou 1 lettre respectivement puis de ne pas matcher la fin optionnelle de la regex pour que la regex soit satisfaite, ils s'en contentent donc ! Parfaitement logique.

    Maintenant pour en revenir à ton problème, je te recommande soit de passer à l'un des modules parser d'HTML, soit d'utiliser des regexs multilignes sur l'ensemble de ton fichier, tu ne t'en sortiras jamais sinon. (Et franchement, si ton HTML est un rien complexe, je te recommande vraiment de te tourner vers les modules spécialisés plutôt, imagine par exemple que tu ais un autre <span> ou <td> imbriqué dans la réponse que tu souhaites...).

    --
    Jedaï

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 6
    Par défaut
    Merci a tous pour votre aide, je crois avoir resolu mon probleme 'a la main' (je crois que c est necessaire avant de passer a l utilisation de modules).
    Pour en revenir a ton conseil jedai (justement l utilisation d un parser HTML), ces parsers sont ils assez 'malins' pour que les erreurs de codage HTML soient transparentes ? Par exemple un <td> sans </td> ?
    Je laisse ici mon code pour critiques :
    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
     
    open (FILE , 'c:\blabla.txt') or die "Grosproblemo : $! \n";
    open (OUTFILE, '>c:\blablamod.txt') or die "MedioProblemo";
    while(my $line=<FILE>)
    {
        chomp($line);
        $compt++;
        $token="";
        if ($line=~ m[class="(titre|auteur|&eacute;diteur|texte|format)">(.+?)(<(/td|/span|br)>\s*)?$])
        {
          my $l1=$compt;
          print OUTFILE $compt," : ",uc($1)," : ",$2," ";
     
          my $theme=$1;
          $token=$2;
          if (!$4)
          {
             do
            {
              $line=<FILE>;
              chomp($line);
              $compt++;
              if ($line!~m[^\s*(.*?)(<(/td|/span|br)>\s*?)+$])
              {
                $line=~s/^\s*//;
                print OUTFILE $line," ";
              }
              else
              {
                print OUTFILE $1,"\n";
                goto MORE;
              }
            }
            while(1);
     
         MORE :   print OUTFILE "Derniere ligne : ",$compt,"\n";
     
          }
          print OUTFILE "\n";
        }
    }
    close(OUTFILE);
    close(FILE);
    print "c est fini";

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Par défaut
    oui, HTML-Parser sait gerer le HTML mal formé

Discussions similaires

  1. Débutant sur le premier exemple Qt
    Par a028762 dans le forum Débuter
    Réponses: 8
    Dernier message: 12/02/2014, 18h03
  2. [Débutant] Bloqué au premier tutoriel...
    Par rvweb dans le forum Zope
    Réponses: 1
    Dernier message: 29/01/2007, 13h48
  3. [Débutant] Mon premier programme: rien ne va...
    Par vincent0 dans le forum OpenGL
    Réponses: 10
    Dernier message: 02/08/2005, 13h59
  4. [débutant][JDialog] laisser la fenetre au premier plan ?
    Par Gromitou dans le forum Agents de placement/Fenêtres
    Réponses: 6
    Dernier message: 03/09/2004, 11h33
  5. [débutant] select du premier record.
    Par Anonymous dans le forum Langage SQL
    Réponses: 5
    Dernier message: 25/06/2004, 09h17

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