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

Web Perl Discussion :

Utilisation du module HTML::Parser


Sujet :

Web Perl

  1. #1
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 47
    Points : 54
    Points
    54
    Par défaut Utilisation du module HTML::Parser
    Bonjour à Jedai et aux utilisateurs du forum,

    Aujourd'hui, j'aimerai apprendre l'utilisation du module HTML:: Parser pour récupérer les informations "data" dans le code ci dessous:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ...
    <tr>
    <td class="titre" align="center"><b>categorie</b><br></td>
     
    <td class="texte" align="center"><span class="textegras">data1</span></td>
    <td class="texte" align="center"><span class="textegras">data2</span></td>
    <td class="texte" align="center"><span class="textegras">data3</span></td>
    </tr>
    ...
    Sauf erreur de ma part, HTML:: Parser génère des évènements quand il analyse le code. d'après la documentation du module / cpan

    donc on pourrait avoir ce début de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        use HTML::Parser;
     
        my $page = ( "détient le contenu html a parser" );
     
        # création de mon parser
        my $parser = HTML::Parser->new();
     
        # définition des mes evenements
        $parser->handler( text  => \&text,  "text" );
        $parser->handler( start => \&start, "tagname,attr" );
        $parser->handler( end   => \&end,   "tagname" );
    l'évènement "text" est déclenché quand un morceau de texte est détecté.
    l'évènement "start" correspond à l'ouverture d'une balise.
    l'évènement "end" correspond à la fermeture d'une balise.

    Donc ma solution serait d'indiquer en la balise <span> ... </span> mais je bloque à ce niveau. Merci pour vos conseils.

    Altecad

  2. #2
    Expert éminent
    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
    Points : 8 586
    Points
    8 586
    Par défaut
    La solution passe par la simulation d'une machine à état.
    Soit tu utilises des variables globales (beurk ), soit tu utilises de bien plus mignonnes closures :
    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
    45
    46
    47
    48
    49
    50
    51
    #!/usr/bin/perl
    use strict; use warnings;
     
    use HTML::Parser;
     
    my $page = "détient le contenu html a parser";
     
    # création de mon parser
    my $parser = HTML::Parser->new();
     
    # définition des mes evenements
    $parser->handler( text  => \&text,  "dtext" );
    $parser->handler( start => \&start, "tagname,attr" );
    $parser->handler( end   => \&end,   "tagname" );
     
    $parser->parse($page);
     
    # définition des callbacks
    # on les rassemble dans un bloc pour que les variables lexicales
    # sur lesquels on les clos soient invisibles du reste du script
    {
        my $in_span_textegras;
        my @data;
     
        sub start {
            my ($tag, $attr) = @_;
            $in_span_textegras++ 
                if $tag eq 'span' and $attr->{class} eq 'textegras';
        }
     
        sub end {
            my ($tag) = @_;
            $in_span_textegras--
                if $tag eq 'span' and $in_span_textegras;
        }
     
        # tu souhaiteras peut-être faire ton traitement directement
        # dans cette fonction
        sub text {
            my ($text) = @_;
            push @data, $text
                if $in_span_textegras;
        }
     
        # si tu fais le traitement dans text() tu n'auras pas besoin
        # de cette fonction
        sub get_datas {
            return @data;
        }
     
    }
    Ceci ne marchera bien que si tu peux garantir qu'il n'y aura pas de <span> à l'intérieur de tes "datas", et ne retiendra que le texte à l'intérieur de ces "datas", néanmoins ça devrait te fournir une base pour comprendre quoi faire si ton cas est plus complexe.

    --
    Jedaï

  3. #3
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 47
    Points : 54
    Points
    54
    Par défaut
    Je viens de tester les 3 sub et j'ai un début de résultat. A moi maintenant de paufiner

    Merci pour ton aide et tes explications Jedaï

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 31
    Points : 17
    Points
    17
    Par défaut
    Bonjour, Je sais que ce post est pas tout neuf mais j'ai en gros le même problème que le posteur initial.
    J'ai en entrée un fichier html et je cherche à recuperer uniquement l'information textuel de ce fichier :
    <td class="avistxt" width="290">Alors pour moi qui bricole .... ou pour ouvrir un dossier.</td>
    et j'aimerais recuperer uniquement : " Alors pour moi qui bricole ....blabla... ou pour ouvrir un dossier.

    C'est à titre d'exemple biensur :)

    j'ai réutiliser le code exposé dans ce post, ce qui me donne :
    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
    #!/usr/bin/perl
    use strict; use warnings;
     
    use HTML::Parser;
     
    my $page = "Z:\essai.html";
     
    # création de mon parser
    my $parser = HTML::Parser->new();
     
    # définition des mes evenements
    $parser->handler( text  => \&text,  "text" );
    $parser->handler( start => \&start, "tagname,attr" );
    $parser->handler( end   => \&end,   "tagname" );
     
    $parser->parse($page);
     
    {
        my $in_span_textegras;
        my @data;
     
        sub start {
            my ($tag, $attr) = @_;
            $in_span_textegras++ 
                if $tag eq 'td' and $attr->{class} eq 'avistxt';
        }
     
        sub end {
            my ($tag) = @_;
            $in_span_textegras--
                if $tag eq 'td' and $in_span_textegras;
        }
     
        sub text {
            my ($text) = @_;
            push @data, $text
              if $in_span_textegras;
        }
     
    }
    Est ce que vous y voyez des erreurs ? est ce que à la place de "dtext" dois je mettre mes mots à rechercher sachant que le contenu textuel change à chaque page ?
    Est ce que le faite que je sois sous windows pose un souci sur l'utilisation de PERL ?
    tant de réponse qui me sont encore inconnu pour une simple débutante que je suis :p

    merci à ceux qui répondront

  5. #5
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    cree toi un autre post

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [DOM] Utilisation du DOM pour parser une page HTML en php
    Par chabliya dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 01/05/2012, 22h13
  2. Utilisation html parser ?
    Par aamad dans le forum Général Java
    Réponses: 4
    Dernier message: 12/06/2010, 06h05
  3. Réponses: 5
    Dernier message: 23/05/2007, 18h48
  4. Utilisation de HTML::Parser
    Par mobscene dans le forum Web
    Réponses: 6
    Dernier message: 27/10/2005, 14h57
  5. [Parser HTML] quel parser utiliser pour du HTML 4.0 ?
    Par Cyber@l dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 19/07/2004, 20h32

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