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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    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
    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 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 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
    Membre à l'essai
    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
    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 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
    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
    Membre à l'essai
    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
    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 chevronné
    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
    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.

  7. #7
    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 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ï

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