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

Modules Perl Discussion :

Parsing fichier html et les stocker sur un fichier texte.


Sujet :

Modules Perl

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 7
    Points : 1
    Points
    1
    Par défaut Parsing fichier html et les stocker sur un fichier texte.
    Bonjour,

    j'essaye de recuperer des donnees d'un fichier html (type de celui ci http://www.entreprises.rhone-alpes.c...prise/rwp/ID/2) et de remettre les informations interessantes dans un fichier texte.
    J'ai essaye d'utiliser HTML:: Parser mais j'avoue que je n'y comprends pas grand chose.
    quelqu'un pourrait il m'aider? (je précise, pour ceux qui ne l'auraient pas compris que je suis relativement novice en PERL).

    merci.

    Xavier.

  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
    Citation Envoyé par xaviers Voir le message
    quelqu'un pourrait il m'aider?
    Peut-être, et sans doute même probablement... Mais il va falloir poser des questions pour ça !

    --
    Jedaï

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    en effet ca peut etre utile si je veux une reponse .
    Le probleme est que je n'arrive pas a comprendre comment recuperer les infos qui m'interessent . j'ai beau lire la doc du cpan sur html::parser, je ne comprends pas comment l'utiliser.
    ma question est donc: quelqu'un connaitrait la syntaxe a utiliser (ou une source ou je puisse trouver de l'info relativement comprehensible) avec html::parser (ou bien encore avez vous une idee de comment faire autrement qu'avec ce module).

    merci.

  4. #4
    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
    HTML::Parser utilise une approche basé sur les callbacks, autrement dit, on lui spécifie quelques fonctions à lancer quand il rencontre certains éléments d'un document HTML et on il les lance lui-même au bon moment lorsqu'il parse un tel élément.

    Ok, c'est pas forcément très clair... Voyons un exemple :
    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
    #! /usr/bin/perl
    use strict; use warnings;
     
    use HTML::Parser ();
     
    my $p = HTML::Parser->new( api_version => 3,
                             start_h => [\&start, "tagname"],
                             end_h   => [\&end,   "tagname"],
                           );
     
    $p->parse_file(shift);
     
    sub start {
       my ($tagname) = @_;
       print "Le tag $tagname a commencé.\n";
    }
     
    sub end {
       my ($tagname) = @_;
       print "Le tag $tagname a terminé.\n";
    }
    Ici on crée deux fonctions, start() et end(), mais on ne les appelle pas nous même, on les attaches à deux évènements start_h et end_h qui se produisent au début et à la fin d'un élément html. "tagname" spécifie quels arguments doivent être passés aux callbacks (dans ce cas le tag, sans "/" au début).
    HTML::Parser appellera start("tag") à chaque qu'il rencontrera une balise ouvrante et end("tag") à chaque fois qu'il rencontrera une balise fermante.

    On lance ce script sur le document d'exemple suivant :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <html>
      <head>
        <title>Example document</title>
      </head>
      <body>
        <h1>Ce document est un exemple :</h1>
        <p>Lorem Ipsu factus....blablabla</p>
      </body>
    </html>
    Le résultat :
    Le tag html a commencé.
    Le tag head a commencé.
    Le tag title a commencé.
    Le tag title a terminé.
    Le tag head a terminé.
    Le tag body a commencé.
    Le tag h1 a commencé.
    Le tag h1 a terminé.
    Le tag p a commencé.
    Le tag p a terminé.
    Le tag body a terminé.
    Le tag html a terminé.
    Est-ce un peu plus clair ? Il y a également le parser HTML::TokeParser qui sera peut-être plus facile à utiliser pour toi.
    Nous manquons un peu d'éléments sur ton expérience toutefois, tu es novice en Perl soit, mais à quel point, et quel sont tes expériences antérieures en informatique ?

    --
    Jedaï

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    je te remercie vraiment, je commence a y voir un peu plus clair.

    en cherchant sur internet, j'ai trouve le script htext qui enleve tous les tags et qui marche plutot bien. mais maintenant le probleme est de stocker le resultat dans un fichier texte. et pour l'instant ca ne marche pas. je pense qu'il faut que je reussisse a traiter le fichier ligne par ligne et a envoyer le resultat avec un print dans mon fichier de destination, mais je n'y arrive pas. une idee?

    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
    #!/usr/bin/perl -w
     
    use strict;
    use HTML::Parser 3.00 ();
     
    open(DETAIL_SOCIETE,">detail_societe.txt") || die  ("erreur de creation du fichier detail_societe.txt");
     
    my %inside;
     
    sub tag
    {
       my($tag, $num) = @_;
       $inside{$tag} += $num;
       print " ";  # not for all tags
    }
     
    sub text
    {
        return if $inside{script} || $inside{style};
        print $_[0];
    }
     
     
    my $p = HTML::Parser->new(api_version => 3,
    		  handlers    => [start => [\&tag, "tagname, '+1'"],
    				  end   => [\&tag, "tagname, '-1'"],
    				  text  => [\&text, "dtext"],
    				 ],
    		  marked_sections => 1,
    	);
    print DETAIL_SOCIETE $p->parse_file("2.html") || die "Can't open file: $!\n";;
     
     
     
    close(DETAIL_SOCIETE);
    encore merci pour le coup de main.

    PS: j'ai regarde tokeparser, pour l'instant je ne le trouve pas beaucoup plus simple
    PPS: comment te sers tu de "shift" dans ton code?

  6. #6
    Membre confirmé
    Avatar de Schmorgluck
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2006
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    Perso, pour faire ça, j'utiliserais xslt, mais c'est parce que je connais déjà xslt L'apprendre juste pour ça ne vaut sans doute pas le coup.
    Si j'ai bien compris, ce que tu cherches à faire, c'est simplement virer les balises, c'est ça ? Parce que si c'est ça, il doit y avoir moyen de le faire assez simplement, sans trop s'embêter à parser proprement le html.

    Pour ce qui est de shift, c'est un opérateur qui retourne le premier élément d'une liste en l'enlevant de la liste. Par conséquent, pour s'en servir, c'est du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my @liste = qw(foo bar be cue);
    my $element = shift @liste ;
    print "element : $element\n";
    print "liste restante : ".(join ",",@liste)."\n";
    Ce qui donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    element : foo
    liste restante : bar,be,cue
    Et il y a une FAQ pour ça.
    There's nothing like $HOME!

  7. #7
    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 xaviers Voir le message
    en cherchant sur internet, j'ai trouve le script htext qui enleve tous les tags et qui marche plutot bien. mais maintenant le probleme est de stocker le resultat dans un fichier texte. et pour l'instant ca ne marche pas. je pense qu'il faut que je reussisse a traiter le fichier ligne par ligne et a envoyer le resultat avec un print dans mon fichier de destination, mais je n'y arrive pas. une idee?
    Est-ce que le résultat que tu obtiens sur la sortie standard te satisfait ? Si c'est le cas pourquoi ne pas simplement utiliser ">detail_societe.txt" en ligne de commande et te débarrasser de ce open() superflu ?
    En tout cas voici un script qui écrit correctement dans le fichier :
    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
    !/usr/bin/perl -w
    use strict;
    use HTML::Parser 3.00 ();
     
    open(DETAIL_SOCIETE,">detail_societe.txt") || die  ("erreur de creation du fichier detail_societe.txt");
     
    my %inside;
     
    sub tag
    {
       my($tag, $num) = @_;
       $inside{$tag} += $num;
       print DETAIL_SOCIETE " ";  # not for all tags
    }
     
    sub text
    {
        return if $inside{script} || $inside{style};
        print DETAIL_SOCIETE $_[0];
    }
     
     
    my $p = HTML::Parser->new(api_version => 3,
    		  handlers    => [start => [\&tag, "tagname, '+1'"],
    				  end   => [\&tag, "tagname, '-1'"],
    				  text  => [\&text, "dtext"],
    				 ],
    		  marked_sections => 1,
    	);
    $p->parse_file("2.html") || die "Can't open file: $!\n";;
     
     
     
    close(DETAIL_SOCIETE);
    Pour ce qui est de shift, c'est un opérateur qui retourne le premier élément d'une liste en l'enlevant de la liste.
    Mon usage du shift est un peu particulier en cela que je ne lui transmet pas de paramètre, il tente alors de procéder sur la liste @_ s'il est dans une fonction, ou @ARGV s'il est dans le corps du programme. Ainsi mon premier script prenait en paramètre le chemin du fichier où l'appliquer (et j'utilisais une redirection pour mettre le résultat dans le fichier que je voulais).

    --
    Jedaï

  8. #8
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    merci beaucoup, c'est vraiment tres gentil a vous de me filer un coup de main.

    mais j'ai encore quelques petits soucis

    la forme ne me plait pas, j'ai donc voulu enlever tous ces espaces qui ne servaient a rien dans mon fichier txt. J'ai reussi a enlever les espaces de debuts de ligne, mais impossible d'enlever les retours chariots. alors j'ai tente une feinte qui marche encore moins: ouvrir le fichier, supprimer les retours chariots avec chomp puis par la suite le reenregistrer. Mais ca ne marche pas. ca enleve les retours chariot, mais a la place j'ai des caracteres etranges.

    une idee?

    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 -w
    use strict;
    use HTML::Parser 3.00 ();
     
    open(DETAIL_SOCIETE,">detail_societe.txt") || die  ("erreur de creation du fichier detail_societe.txt");
     
    my %inside;
     
    sub tag
    {
       my($tag, $num) = @_;
       $inside{$tag} += $num;
       print DETAIL_SOCIETE "";  # not for all tags
    }
     
    sub text
    {
        return if $inside{script} || $inside{style};
        $_[0] =~ s/^[ \t\n]+//mg;
        print DETAIL_SOCIETE $_[0];
    }
     
     
    my $p = HTML::Parser->new(api_version => 3,
    		  handlers    => [start => [\&tag, "tagname, '+1'"],
    				  end   => [\&tag, "tagname, '-1'"],
    				  text  => [\&text, "dtext"],
    				 ],
    		  marked_sections => 1,
    	);
    $p->parse_file("2.html") || die "Can't open file: $!\n";;
     
     
    #fermeture et ouverture du fichier source (sinon erreur, mais je ne sais pas pourquoi)
    close(DETAIL_SOCIETE);
    open(DETAIL_SOCIETE,"detail_societe.txt") || die  ("erreur d'ouverture du fichier detail_societe.txt");
     
    #Creation du fichier modifie
    open(DETAIL_SOCIETE_MOD,">detail_societe_mod.txt") || die  ("erreur de creation du fichier detail_societe_mod.txt");
     
     
    while(<DETAIL_SOCIETE>)
    {
        chomp;
        print DETAIL_SOCIETE_MOD;
     
    }
     
     
    close(DETAIL_SOCIETE);
    close(DETAIL_SOCIETE_MOD);

    PS: desole, je sais que le code est affreux.
    PPS: j'utilise la commande open pour pouvoir traiter par la suite un ensemble de fichiers html dont la liste est contenue dans un autre fichier texte.

  9. #9
    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
    Salut,

    Si tu dois fermer puis rouvrir ton fichier, c'est simplement parce que la position système d'un handle de fichier ne revient pas automatiquement au début du fichier quand elle est arrivée à la fin de ton fichier. Pour ne pas avoir à fermer puis rouvrir ton fichier, utilise la fonction seek (pour revenir au début : seek(HANDLE, 0, 0)).

    Sinon, pourquoi tu ne modifies pas ta regex comme ceci ?
    Par contre, je ne comprend pas pourquoi tu as des symboles bizarre...
    "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.

  10. #10
    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
    Tu as oublié le /x :
    Par ailleurs un simple seek() ne va pas suffire dans son cas : un coup il ouvre le fichier en écriture, un coup il l'ouvre en lecture (il pourrait l'ouvrir en lecture-écriture une seule fois, remarque).

    --
    Jedaï

  11. #11
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    genial, c'est preque bon (mais forcement encore quelques problemes ):

    voila le code que j'utilise (merci Jedai pour la regex)

    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
    #!/usr/bin/perl -w
    use strict;
    use HTML::Parser 3.00 ();
     
    open(DETAIL_SOCIETE,">detail_societe.txt") || die  ("erreur de creation du fichier detail_societe.txt");
     
    my %inside;
     
    sub tag
    {
       my($tag, $num) = @_;
       $inside{$tag} += $num;
       print DETAIL_SOCIETE "";  # not for all tags
    }
     
    sub text
    {
        return if $inside{script} || $inside{style};
        $_[0] =~ s/^\s+|\s+$//mg;
        print DETAIL_SOCIETE $_[0];
    }
     
     
    my $p = HTML::Parser->new(api_version => 3,
    		  handlers    => [start => [\&tag, "tagname, '+1'"],
    				  end   => [\&tag, "tagname, '-1'"],
    				  text  => [\&text, "dtext"],
    				 ],
    		  marked_sections => 1,
    	);
    $p->parse_file("2.html") || die "Can't open file: $!\n";;
     
    close(DETAIL_SOCIETE);

    et voila ce que j'obtiens dans mon fichier detail_societe.txt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    EXCELVISION - Informations sur la sociétéCréer ou reprendre une entrepriseTransmettre son entrepriseTrouver desfinancementsInnoverRéussir à l'internationalFormer les hommesConduire sa démarche environnementDévelopper ses marchésTrouver des partenairesDévelopper son commerce et son entreprise de servicesAménager et développer les territoiresPromouvoir le tourisme en Rhône-alpesSimplifier ses formalitésConjoncture économiqueChiffres clésPanorama de l'économieRhône-Alpes en cartesCoup de projecteurRépertoire de 4 000 entreprisesLes CCI en Rhône-AlpesLes CCI en ligneLes experts des CCIOrganisation et missions des CCIActivités 2003 des CCIArist Rhône-AlpesCentre Relais InnovationTourhônalpesR3APCompétencesExportRhônalpexportReprendre pour entreprendreObjectif partenariatFoires et salonsNotre sélection de liensLibrairie économiqueplus de 350 publicationsEspace presseCommuniqués de presseLes magazinesdes CCI   fiche
    de presentation de l'etablissementRaison sociale : EXCELVISIONActivité détaillée : Conditionnement de liquides stériles unidoses et multidoses.Code APE : 244CEffectif salarié : 74Ville : ANNONAYCode postal : 07100Adresse : 27 rue de la LombardièreTéléphone : 04 75 32 40 40Fax : 04 75 67 71 98Groupe : FAREVA (LUXEMBOURG)Certifications/Qualifications : ISO 9001.Site web : www.excelvision-pcg.com/fr     > Recherched'entreprises en Rhône-Alpes> Inscrire votre entreprise dans le répertoire> Accueil répertoire des 4000 entreprises
    C'est pas trop mal (meme si c'est pas super joli, je vois un peu mieux) mais je pense que ca suffira. Maintenant ce que je veux c'est recuperer les informations
    "EXCELVISION" "Conditionnement de liquides stériles unidoses et multidoses" "244C" ... jusqu'à la fin du fichier.

    et c'est la que ca ne marche plus : j'ai voulu ajouter ca en fin de fichier

    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
    open(DETAIL_SOCIETE,"detail_societe.txt") || die  ("erreur d'ouverture du fichier detail_societe.txt");
     
    open(SYNTHESE,">>synthese.txt") || die ("erreur avec le fichier synthese.txt");
     
    while(<DETAIL_SOCIETE>){
        /Raison sociale :(.*?)Activité détaillée :/gs;
        print SYNTHESE "$1";
        /Activité détaillée :(.*?)Code APE :/gs;
        print SYNTHESE '//'."$1";
        /Code APE :(.*?)Effectif salarié :/gs;
        print SYNTHESE '//'."$1";
        /Effectif salarié :(.*?)Ville :/gs;
        print SYNTHESE '//'."$1";
        /Ville :(.*?)Code postal :/gs;
        print SYNTHESE '//'."$1";
        /Code postal :(.*?)Adresse :/gs;
        print SYNTHESE '//'."$1";
        /Adresse :(.*?)Téléphone :/gs;
        print SYNTHESE '//'."$1";
        /Téléphone :(.*?)Fax :/gs;
        print SYNTHESE '//'."$1";
        /Fax :(.*?)Groupe :/gs;
        print SYNTHESE '//'."$1";
        /Groupe :(.*?)Certifications\/Qualifications :/gs;
        print SYNTHESE '//'."$1";
        /Certifications\/Qualifications :(.*?)Site web :/gs;
        print SYNTHESE '//'."$1\n";
        }
     
     
    close(DETAIL_SOCIETE);
    close(SYNTHESE);

    mais ca me fait des erreurs de partout:


    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
    Use of uninitialized value in string at ./htext.pl line 40, <DETAIL_SOCIETE> line 1.
    Use of uninitialized value in string at ./htext.pl line 42, <DETAIL_SOCIETE> line 1.
    Use of uninitialized value in string at ./htext.pl line 44, <DETAIL_SOCIETE> line 1.
    Use of uninitialized value in string at ./htext.pl line 46, <DETAIL_SOCIETE> line 1.
    Use of uninitialized value in string at ./htext.pl line 48, <DETAIL_SOCIETE> line 1.
    Use of uninitialized value in string at ./htext.pl line 50, <DETAIL_SOCIETE> line 1.
    Use of uninitialized value in string at ./htext.pl line 52, <DETAIL_SOCIETE> line 1.
    Use of uninitialized value in string at ./htext.pl line 54, <DETAIL_SOCIETE> line 1.
    Use of uninitialized value in string at ./htext.pl line 56, <DETAIL_SOCIETE> line 1.
    Use of uninitialized value in string at ./htext.pl line 58, <DETAIL_SOCIETE> line 1.
    Use of uninitialized value in concatenation (.) or string at ./htext.pl line 60, <DETAIL_SOCIETE> line 1.
    Use of uninitialized value in string at ./htext.pl line 40, <DETAIL_SOCIETE> line 2.
    Use of uninitialized value in string at ./htext.pl line 42, <DETAIL_SOCIETE> line 2.
    Use of uninitialized value in string at ./htext.pl line 44, <DETAIL_SOCIETE> line 2.
    Use of uninitialized value in string at ./htext.pl line 46, <DETAIL_SOCIETE> line 2.
    et le resultat dans mon fichier synthese.txt est:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ////////////////////
    //////// ANNONAY// ANNONAY// ANNONAY// ANNONAY// 04 75 67 71 98// 04 75 67 71 98// ISO 9001.

    C'est presque ca mais pas tout a fait quand meme.

    Quelqu'un sait ce qu'il faut changer? (bientot en mode resolu je le sens ).

    Encore un grand merci.

  12. #12
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Voila le code (presque final j'espere):


    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    #!/usr/bin/perl -w
    use strict;
    use HTML::Parser 3.00 ();
     
    # Definition des attributs de HTML::Parser
     
    my %inside;
    my $ligne;
     
    sub tag
    {
       my($tag, $num) = @_;
       $inside{$tag} += $num;
       print DETAIL_SOCIETE "";  # not for all tags
    }
     
    sub text
    {
        return if $inside{script} || $inside{style};
        $_[0] =~ s/^\s+|\s+$//mg;
        print DETAIL_SOCIETE $_[0];
    }
     
     
    my $p = HTML::Parser->new(api_version => 3,
    		  handlers    => [start => [\&tag, "tagname, '+1'"],
    				  end   => [\&tag, "tagname, '-1'"],
    				  text  => [\&text, "dtext"],
    				 ],
    		  marked_sections => 1,
    	);
     
    #Ouverture du fichier contenant la liste des fichiers à traiter "liste_ID.txt" 
    #et creation du fichier de synthèse "synthese.txt"
     
    open(LISTE_SOCIETE,"liste_ID.txt") || die ("erreur d'ouverture du fichier liste_ID.txt");
    open(SYNTHESE,">>synthese.txt") || die ("erreur avec le fichier synthese.txt");
     
    #lecture de toutes les lignes de LISTE_SOCIETE
    while(chomp($ligne = <LISTE_SOCIETE>)){
     
        #effacement de l'ancien fichier contenant les informations relatives à la societe en cours.
        unlink ("detail_societe.txt");
     
        #création du fichier qui contiendra les informations relatives à la société en cours.
        open(DETAIL_SOCIETE,">detail_societe.txt") || die  ("erreur de creation du fichier detail_societe.txt"); 
     
        #Utilisation du module HTML:Parser et stockage dans le fichier DETAIL_SOCIETE.
        $p->parse_file($ligne.'.html') || die "Can't open file: $!\n";;
     
        #Fermeture et Reouverture du fichier "detail_societe.txt" pour revenir en debut de fichier.
        close(DETAIL_SOCIETE);
        open(DETAIL_SOCIETE,"detail_societe.txt") || die  ("erreur d'ouverture du fichier detail_societe.txt");
     
     
        #Selection et inscription des informations interessantes dans le fichier synthese.txt
        while(<DETAIL_SOCIETE>){
            if (/Raison sociale :(.*?)Activité détaillée :/gs){
                print SYNTHESE "$1";
            }
            else{
                print SYNTHESE "N.C.";
            }
     
            if (/Activité détaillée :(.*?)Code APE :/gs){
                print SYNTHESE '//'."$1";
            }
            else{
                print SYNTHESE '//'."N.C.";
            }
     
            if (/Code APE :(.*?)Effectif salarié :/gs){
                print SYNTHESE '//'."$1";
            }
            else{
                print SYNTHESE '//'."N.C.";
            }
     
            if (/Effectif salarié :(.*?)Ville :/gs){
                print SYNTHESE '//'."$1";
            }
            else{
                print SYNTHESE '//'."N.C.";
            }
     
            if (/Ville :(.*?)Code postal :/gs){
                print SYNTHESE '//'."$1";
            }
            else{
                print SYNTHESE '//'."N.C.";
            }
     
            if (/Code postal :(.*?)Adresse :/gs){
                print SYNTHESE '//'."$1";
            }
            else{
                print SYNTHESE '//'."N.C.";
            }
     
            if (/Adresse :(.*?)Téléphone :/gs){
                print SYNTHESE '//'."$1";
            }
            else{
                print SYNTHESE '//'."N.C.";
            }
     
            if (/Téléphone :(.*?)Fax :/gs){
                print SYNTHESE '//'."$1";
            }
            else{
                print SYNTHESE '//'."N.C.";
            }
     
            if (/Fax :(.*?)Groupe :/gs){
                print SYNTHESE '//'."$1";
            }
            else{
                print SYNTHESE '//'."N.C.";
            }
     
            if (/Groupe :(.*?)Certifications\/Qualifications :/gs){
                print SYNTHESE '//'."$1";
            }
            else{
                print SYNTHESE '//'."N.C.";
            }
     
            if (/Certifications\/Qualifications :(.*?)Site web :/gs){
                print SYNTHESE '//'."$1\n";
            }
            else{
                print SYNTHESE '//'."N.C.\n";
            }
     
        }
     
        close(DETAIL_SOCIETE);
    }
     
    close(SYNTHESE);
    close(LISTE_SOCIETE);
    J'ai toujours plus ou moins les memes problemes:

    - La liste de fichier html a traiter (liste_ID.txt) comporte 6 noms et pourtant j'obtiens des resultats (synthese.txt) sur 11 lignes (ce qui devrait correspondre à 11 fichiers html). Il me semble que mon fichier temporaire detail_societe.txt possede 2 voire 3 lignes alors qu'il ne devrait en avoir qu'une, donc je pense que ma boucle while(DETAIL_SOCIETE) est effectuee plusieurs fois. Je ne vois pas comment corriger ce problème.

    - Les donnees contenues dans synthese.txt ne sont pas bonnes (exactement le meme type de resultats que dans mon post precedent). J'ai essaye d'enlever une partie du motif, ie accents et espaces (genre /Raison(.*?)Activit/) et la ca marche. Mais du coup j'ai trop d'information (j'obtiens "sociale : EXCELVISION").


    Quelqu'un saurait quoi faire?

  13. #13
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    je me permets de faire un petit up

  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
    Retire les /g à la fin de tes regex.

    --
    Jedaï

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/05/2011, 03h18
  2. Réponses: 21
    Dernier message: 16/04/2008, 10h06
  3. enregistrer les données sur un fichier excel
    Par thunderpat dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 29/05/2007, 17h00
  4. Récupérer les infos sur un fichier audio
    Par Halleck dans le forum Windows
    Réponses: 13
    Dernier message: 17/04/2004, 18h39

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