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 :

Parsing d'une page web


Sujet :

Web Perl

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Par défaut Parsing d'une page web
    Bonsoir,

    je souhaites parser une page web afin de récuperer du texte entre des balises <b>texte<b>

    J'ai regardé le post http://www.developpez.net/forums/d32...e-html-parser/ qui traite d'un sujet similaire et de l'utilisation de HTML:arser.

    J'ai adapté le code comme suit :

    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
    #!/usr/bin/perl
    use strict; 
    use warnings;
     
    use HTML::Parser;
     
    my $page = "C:\\Perl\\web.htm";
     
    # 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 '<b>' and $attr->{class} eq '*';
      }
     
      sub end {
        my ($tag) = @_;
        $in-- if $tag eq '<b>' and $in;
      }
     
      sub text {
        my ($text) = @_;
        push @data, $text if $in;
      }
     
      sub get_data {
        return @data;
      }
    }
    exit;
    mais rien ne s'affiche.

    J'ai remarqué dans les autres cas que les balises était suivi d'une expression ce qui n'est pas le cas de <b> et donc le problème pourrai venir de là cependant ça me dépasse.

    Que la force de Jedaï soit avec moi lool

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Par défaut
    Si tu veux le contenu entre balises sans attributs, alors effectivement, ne te souci pas des attributs, teste simplement le nom du tag (sans les < >):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      sub start {
        my ($tag, $attr) = @_;
        $in++ if $tag eq 'b';
      }
    Je te l'ai un peu réécris pour que ce soit plus facile à comprendre:

    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
    #!/usr/bin/perl -w
    use strict;
    use LWP::Simple;
    use HTML::Parser;
     
    my $tag = 'b';
     
    my $source = shift || 'http://developpez.com/';
    my $page = get($source)
    	or die "Couldn't get $source: $!\n";
     
    my $parser = HTML::Parser->new( api_version => 3,
    						 start_h => [\&start,"tagname"],
    						 text_h => [\&text,"text"],
    						 end_h => [\&end,"tagname"],
    							 );
    my $intag_flag = 0;
    my @intags;
     
    sub start {
    	my ($tagname) = @_;
    	$intag_flag = 1 if $tagname eq $tag;
    }
    sub text {
    	my ($text) = @_;
    	if ($intag_flag) {
    		push @intags, $text;
    	}
    }
    sub end {
    	my ($tagname) = @_;
    	$intag_flag = 0 if ($tagname eq $tag);
    }
     
     
    $parser->parse($page);
    $parser->eof;	
     
    print map {"$_\n"} @intags;
    Regarde la doc du module ou redemande si quelque chose t'échappe.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 7
    Par défaut
    J'ai une question concernant le handler "start".

    Est-il possible d'accéder au contenu du champ de la balise (ce qui est normalement traité par le handler "text") depuis le handler start ?

    Je donne un exemple :

    <a href="http://www.monurl.com">mon texte</a>

    normalement, le handler "start" va nous permettre via $attr->{href} de récupérer l'URL, mais comme je souhaiterais pouvoir construire une hashtable qui possède par exemple en clef l'url, et le texte en valeur correspondante, comment puis-je faire, puisque normalement c'est dans le handler "text" que je vais pouvoir récupérer la valeur de ma balise ?

    Merci d'avance à vous.

Discussions similaires

  1. parsing un contenue d'une page web
    Par maroonet dans le forum Windows Phone
    Réponses: 4
    Dernier message: 29/12/2011, 22h04
  2. [JSP][WEB] recuperer le contenu d'une page web
    Par ypikahe dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 14/03/2008, 10h10
  3. application qui connecte sur une page web
    Par spoolz dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 14/04/2004, 09h47
  4. ouvrir une page Web en mode texte
    Par Halleck dans le forum Windows
    Réponses: 7
    Dernier message: 03/03/2004, 15h08
  5. Réponses: 3
    Dernier message: 28/10/2003, 14h26

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