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 :

Extraire certaines données d'un fichier HTML


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 37
    Points : 12
    Points
    12
    Par défaut Extraire certaines données d'un fichier HTML
    Bonjour à tous ,

    Eternel débutant en perl, malgré le fait que j'ai déjà réalisé un ou deux programmes dans ce langage, je vous prie tout d'abord de m'excuser si ces questions semblent évidentes. Je tiens aussi à préciser que j'ai déjà effecuté
    des recherches sur le forum / sur google pour trouver des informations... en vain.

    En fait, je cherche à extraire des données placés entre des balises, dans une série de fichiers HTML. La structure des blocs dont je souhaite extraire les informations est composée ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <a name="xxxxxxx"></a>Jean Louis [<b>MOD</b>], <i><a href="xxxxxxxxxxxxxxxxxxx"
    >Ceci est un test</a></i>
    puis plus loin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    </td></tr></table><span class=head>TEST.</span>
    et enfin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    </center><p>
     
    ""Tout un texte de plusieurs paragraphes ici""
     
    <table width='100%'>

    Dans ce cas précis, je souhaiterais extraire et placer dans des variables A. "Jean Louis" ; B. "Ceci est un test" ; C. "TEST" et enfin D. L'ensemble du texte placé entre les deux balises.
    Est-ce que cela est possible s'il vous plaît ? Faut-il un (des ?) modules complémentaire(s) ?

    Enfin, j'aurais aimé savoir s'il vous plaît, si à l'ouverture d'un fichier, il était possible de "sauter" les 180 premières lignes pour ne commencer les recherches qu'à partir de ce point ?

    En vous remerciant vivement pour toute aide.
    Cordialement.

  2. #2
    Membre confirmé Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 570
    Points
    570
    Par défaut
    Je te conseille d'utiliser un parser HTML plutôt que d'y aller brutalement à coups d'expressions régulières.

    Tu as un grand choix de modules sur le CPAN. Pour ce que tu souhaites faire, regarde du côté HTML:arser.

    Voici un exemple élémentaire, inspiré de ce que tu veux (je n'ai pas compris le détail) :
    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
    #!/usr/bin/env perl
    use strict; use warnings;
    use HTML::Parser;
     
    my $filename = shift || 'myfile.html'; 
     
    open $fh, '<', $filename or die "$!\n";
     
    my $parser = HTML::Parser->new( api_version => 3,
      start_h => [\&start,"tagname, attr"],
    );
     
    sub start {
        my ($tag, $attr) = @_;
        print $attr->{name}, "\n" if ($tag =~ /^a$/ and defined $attr->{name});    
        print $attr->{href}, "\n" if ($tag =~ /^a$/ and defined $attr->{href});
    }
     
    $parser->parse_file($fh);
    $parser->eof;
    Si tu jettes un oeil même rapide à la doc, tu devrais voir comment ça marche. Sinon, n'hésite pas à poster tes essais et à demander.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 37
    Points : 12
    Points
    12
    Par défaut
    Tout d'abord merci vivement pour ton aide. Désolé en revanche pour la lenteur (j'ai eu en parallèle quelques menus problèmes de RAM : ça fait toujours plaisir ). Je promets de réagir plus vite la prochaine fois : merci beaucoup en tout cas.

    J'avais croisé la solution HTML parser, mais avant de me lancer dedans, j'aurais vraiment aimé savoir si elle était bien adaptée à la tâche que je veux réaliser : en effet dans mes exemples, les champs que je cherche à extraire se trouvent hors des balises html. En gros, on pourrait assimiler ça à la récupération de données se situant entre deux morceaux de textes définis (que se soit des balises ou non). Dans ce cas bien précis, ne vaut-il pas mieux que je regarde du côté des expressions régulières s'il vous plaît ?

    Merci à tout ceux qui pourront répondre à mes interrogations. Je suis aussi preneur si quelqu'un propose une autre méthode (non que celle d'iblis me semble mauvaise - au contraire -, seulement si je peux éviter d'avoir à installer un module et à apprendre son fonctionnement - qui m'a l'air plutôt complexe dans le cas de ce que je souhaite réaliser -, cela m'arrangerait bien... ).
    Il s'agit d'un simple programme pour transformer une série de fichiers HTML en fichiers adaptés à ma base de donnée. Il ne servira donc qu'une fois... d'où mon envie de faire au plus simple.

    Merci à tous ceux qui voudront bien partager leurs idées .

  4. #4
    Membre confirmé Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 570
    Points
    570
    Par défaut
    Tu peux bien sûr y aller à coup d'expressions régulières, par exemple pour ton premier cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print $1 while $html =~ m|<a name="\w+"></a>(.[^<]+)|sg
    Remarque l'usage de l'option s pour traiter la chaîne comme une ligne simple (où . matche \n).

    Tu peux bien sûr, chaîner tes recherches en reprenant au dernier match.

    Je te laisse le soin de t'initier au regex, si tu ne l'as pas déjà fait, avec FAQ Perl expressions régulières et perlretut.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 37
    Points : 12
    Points
    12
    Par défaut
    Merci beaucoup, de nouveau, Iblis.
    Je suis désolé, ce n'est pas très poli et je m'en excuse, mais je vais devoir - je crois - attendre quelques jours avant de tester tout ça ... trop de problème sur le PC (.... et MemTest qui trouve un fois, pas l'autre, ).

    En tout cas je sauvegarde tes conseils et j'applique ça dès que je peux (j'espère d'ici quelques jours). Merci, vraiment, pour ton aide précieuse.

    Cordialement.

Discussions similaires

  1. Extraire des données d'un fichier html
    Par marco056 dans le forum Général Python
    Réponses: 9
    Dernier message: 02/07/2013, 20h38
  2. Réponses: 8
    Dernier message: 01/02/2013, 16h58
  3. Réponses: 3
    Dernier message: 14/01/2010, 22h30
  4. [XL-2007] Extraire que certaines données d'un fichier csv
    Par Fouinette85 dans le forum Macros et VBA Excel
    Réponses: 23
    Dernier message: 06/05/2009, 23h37
  5. extraire certaines données d'un fichier texte
    Par davz88 dans le forum C++
    Réponses: 11
    Dernier message: 26/03/2005, 13h00

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