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 :

Extraction du text dans un fichier html


Sujet :

Web Perl

  1. #1
    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 Extraction du text dans un fichier html
    Bonjour,
    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 un ancien 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
    41
    #!/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;
    }
     
    }
    Comme vous vous en doutez, je n'ai pas ou presque pas de connaissance dans le language PERL
    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 ? (désolé si je dis des bétises :s)
    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

  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
    Ben ça m'a l'air très bien tout ça (d'ailleurs je pense que c'est l'un de mes codes vu l'usage de closures).

    Pour afficher ce texte, on va juste rajouter une fonction à l'intérieur du bloc du parser :
    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
    #!/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, "dtext" );
    $parser->handler( start => \&start, "tagname,attr" );
    $parser->handler( end => \&end, "tagname" );
     
    $parser->parse($page);
     
    print get_data();
     
    {
      my $in;
      my @data;
     
      sub start {
        my ($tag, $attr) = @_;
        $in++ if $tag eq 'td' and $attr->{class} eq 'avistxt';
      }
     
      sub end {
        my ($tag) = @_;
        $in-- if $tag eq 'td' and $in;
      }
     
      sub text {
        my ($text) = @_;
        push @data, $text if $in;
      }
     
      get_data {
        return @data;
      }
    }
    Est ce que le faite que je sois sous windows pose un souci sur l'utilisation de PERL ?
    Pas du tout, installe juste ActivePerl (c'est gratuit, et tu n'es pas obligé de donner tes informations).

    --
    Jedaï

  3. #3
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    Bonjour,

    Si tu commençais par nous dire ce qui ne marche pas correctement dans ton code ?

    A première vue, tu as un problème à la première ligne après les use : my $page = "Z:\essai.html";
    Utilise des ' et non pas des ", sinon perl va croire que comme e est précédé d'un antislash, il s'agit d'un caractère spécial, or ce n'est pas le cas.

    Sinon, pas de problème entre Perl et Windows, ils s'entendent très bien

    €dit : Jedai, tu es vraiment trop rapide
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

  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
    Merci à tous pour ces réponses rapides, je me remet dedans et je vous tiens au courant de l'avancement
    [edit] oui jedai s'est bien un de tes codes

  5. #5
    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
    A première vue, tu as un problème à la première ligne après les use : my $page = "Z:\essai.html";
    Utilise des ' et non pas des ", sinon perl va croire que comme e est précédé d'un antislash, il s'agit d'un caractère spécial, or ce n'est pas le cas.
    J'ai finalement opté pour un accés directe à internet :) donc j'ai plus le problème :)

    Hum, après pas mal de test :s, j'arrive à extraire mon texte mais j'ai toujours plien d'erreurs lors de l'excution ... si quelqu'un à une idée, je pense que ca doit vraiment être rien :s

    à chaque test, voila ce qui en sort :

    Use of uninitialized value in string eq at test2.pl line 31.
    Use of uninitialized value in string eq at test2.pl line 31.
    Use of uninitialized value in string eq at test2.pl line 31.
    etc..
    voici le code :

    #!/usr/bin/perl
    use strict;
    use warnings;

    use LWP::Simple;
    use HTML::Parser;
    use HTML::Form;

    my $page = get( "http://toluna.fr/gradignan_est_parfait-av-919318.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);

    print &get_data();

    $parser->eof;
    {
    my $in;
    my @data;

    sub start {
    my ($tag,$attr) = @_;

    $in++ if ($tag eq 'td' and $attr->{class} eq 'avistxt');
    }

    sub end {
    my ($tag) = @_;
    $in-- if ($tag eq 'td' and $in='1');
    }

    sub text {
    my ($text) = @_;
    push @data, $text if ($in );
    }

    sub get_data {
    #print "in : ".$in;
    return @data;
    }

    }
    exit;

  6. #6
    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
    C'est parce que tous tes td n'ont pas une classe :

    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
    #!/usr/bin/perl
    use strict; 
    use warnings;
     
    use HTML::Parser;
     
    my $page = "essai.html";
     
    # 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);
     
    print get_data();
     
    {
      my $in;
      my @data;
     
      sub start {
        my ($tag, $attr) = @_;
        $in++ 
          if $tag eq 'td' 
    	and exists $attr->{$class} 
    	  and $attr->{class} eq 'avistxt';
      }
     
      sub end {
        my ($tag) = @_;
        $in-- if $tag eq 'td' and $in;
      }
     
      sub text {
        my ($text) = @_;
        push @data, $text if $in;
      }
     
      get_data {
        return @data;
      }
    }
    --
    Jedaï

  7. #7
    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
    moaurf un grand merci !!
    Je me disais bien que c'etait pas grand chose

  8. #8
    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
    erf c'etait de courte durée :p
    maintenant j'ai mon fichier.pl qui marche impeccable, je me suis intéressé à la création de mon .exe

    donc voila les manips que j'ai faite :
    ppm install PAR
    pp -o test2.exe test2.pl

    Compress::Zlib object version 1.22 does not match
    oader/0x8b1100/DynaLoader.pm line 225.
    Compilation failed in require at /loader/0x8b1100/
    BEGIN failed--compilation aborted at /loader/0x8b1
    Compilation failed in require at par.pl line 252.
    :s une petite idée ?

  9. #9
    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
    [up] hé ! oui Week end fini, on se remet au boulot
    donc est ce que quelqu'un à deja eu une erreur similaire ?

  10. #10
    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
    J'ai finalement trouvé, j'ai utilisé Perl2.exe et la création de mon .exe se passe nikel .... enfin le .exe se crée bien mais perl2.exe est une version d'essai (donc avec un vieux message qui s'affiche apres 2secondes d'attentes )
    donc niveau vitesse s'est pas le top :s
    si qqun à une autre solution...

  11. #11
    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
    Je continue mon flood au sujet de mon *.exe :s
    Apparement ma version de PAR est la 0.63, il me faut passer en 0.85...
    Comment puisse je faire pour passer dans cette version alors que ppm me propose uniquement la vieille version ??


    [edit] j'ai telecharger : PAR-Packer-0.976, j'essai d'installer
    - nmake,
    - nmake install

    ... mais ca ne marche toujours pas :s

  12. #12
    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
    Essaie de mettre d'autre repository PPM (regarde dans notre FAQ pour quelques adresses), je crois entre autre que theoryx a une version récente de PAR.

    --
    Jedaï

  13. #13
    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
    merci bien Jedai, j'ai réussi à mettre à jour mon PAR (v0.976) mais j'ai toujours un message d'erreur :
    Can't load 'F:/Perl/lib/auto/IO/IO.dll' for module IO: load_file:La procÚdure sp
    ÚcifiÚe est introuvable at F:/Perl/lib/XSLoader.pm line 64.
    at F:/Perl/lib/IO.pm line 11
    Compilation failed in require at F:/Perl/lib/IO/Handle.pm line 263.
    BEGIN failed--compilation aborted at F:/Perl/lib/IO/Handle.pm line 263.
    Compilation failed in require at F:/Perl/lib/IO/Seekable.pm line 101.
    BEGIN failed--compilation aborted at F:/Perl/lib/IO/Seekable.pm line 101.
    Compilation failed in require at F:/Perl/lib/IO/File.pm line 133.
    BEGIN failed--compilation aborted at F:/Perl/lib/IO/File.pm line 133.
    Compilation failed in require at -e line 405.
    F:\Perl\bin\pp: Failed to extract a parl from 'PAR::StrippedPARL::Static' to fil
    e 'parlnUHz1jd.exe' at F:/Perl/site/lib/PAR/Packer.pm line 1149, <DATA> line 1.
    Autant l'erreur d'avant je comprenais autant la je suis perdue :s

  14. #14
    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
    Citation Envoyé par projetGTR Voir le message
    merci bien Jedai, j'ai réussi à mettre à jour mon PAR (v0.976) mais j'ai toujours un message d'erreur :
    Autant l'erreur d'avant je comprenais autant la je suis perdue :s
    Et bien à vrai dire je n'ai jamais réussi à faire marcher cette version de PAR (avec une version 5.9.5 que j'ai compilé moi-même, ça marche, mais avec ActivePerl...), apparemment ils ont amorçé une restructuration majeure du code de PAR et ActivePerl n'est pas encore compatible avec la nouvelle version.
    Essaie de désinstaller celle-ci et d'installer une un peu plus vieille.

    --
    Jedaï

  15. #15
    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,
    Le problème de la création de mon .exe est en stand bail mais j'ai une nouvelle page à extraire le texte. Le souci est que le texte n'est pas entre balise, HTML::Parser ne m'est donc d'aucune utilisé apparement.. non ?

    voici : le style de page que je vous parle, regardez le code de sourse
    http://www.ciao.fr/Total__Avis_246555

    L'idée est de recuperer uniquement l'avis..


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    8  sub start {
    9      my ($self, $tag, $attr, $attrseq, $origtext) = @_;
    Est ce que qqun pourrait m'expliquer les $self, $attrseq, $origtext, parceque autant j'ai bien compris $targ, $attr autant les autres, leur utilité m'echappe ;)
    Si qqun a encore une idée (pendant que je pars à la recherche d'un module PERL) je vous en serais tres reconnaissante

  16. #16
    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
    Je relance le sujet :s
    Peut-on parser un fichier HTML grâce à ces commentaires ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    sub start_verbatim {
        		my ($tag,$attr,$comment) = @_;		
    		$in_v++ if ($comment eq 'google_ad_section_start(name=s3, weight=1.0)');
      	}
     
     	sub end_verbatim {
        		my ($tag,$comment) =  @_;
        		$in_v-- if ($comment eq 'google_ad_section_end(name=sr)' and $in_v='1'); 
      	}
    est ce possible de faire ca ? ( ou quelque chose dans ce style )
    merci d'avance

Discussions similaires

  1. Réponses: 8
    Dernier message: 27/04/2008, 15h27
  2. Réponses: 4
    Dernier message: 05/02/2008, 11h08
  3. Extraction de texte dans une page HTML
    Par ninox_ dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 02/05/2007, 17h29
  4. Extraction de texte dans un fichier
    Par chris91 dans le forum Langage
    Réponses: 4
    Dernier message: 18/08/2006, 16h09
  5. Extraction de données dans un fichier texte en VB6 !
    Par rockroa dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 21/06/2006, 16h00

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