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 :

Problème de parsage


Sujet :

Modules Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 99
    Par défaut Problème de parsage
    Bonjour à tous,

    Je poste mon problème ici, car je ne vois pas du tout où est mon erreur !!

    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
    #!/usr/bin/perl
     
     
    use warnings;
    use HTML::Form;
    use LWP::Simple;
    use HTML::Parser();
    use HTML::LinkExtor;
     
     
    #Constants
    my $baseUrl = 'http://www.pharmgkb.org/do/serve?objId=';
     
    #Variables :
    my $flag = 0;
    my $URL;
    my $Role;
    my $Code;
    my $PharmPage = '';
     
     
    ($#ARGV == 1) or die $!;
     
    $Role = $ARGV[0];
    $Code = $ARGV[1];
     
    print "$Code\n";
    print "$Role\n";
     
     
    if ($Role eq 'Gene'){
    	print "$Code + Gene\n"; 		#Vérifie $Code
    	my $URL = $baseUrl.$Code."&objCls=$Role";
    	print "$URL\n";				#Vérifie $URL
    	my $PharmPage = get("$URL");
    	#print "$PharmPage\n";			#Print le code Source entierement (vérification)
    }
     
    elsif ($Role eq 'Drug') {
    	print "$Code + Drug\n";
    	my $URL = $baseUrl.$Code."&objCls=$Role";
    	print "$URL\n";
    	my $PharmPage = get("$URL");
    }
    elsif ($Role eq 'Disease') {
    	print "$Code + Disease\n";
    	my $URL = $baseUrl.$Code."&objCls=$Role";
    	print "$URL\n";
    	my $PharmPage = get("$URL");
    }
    else {(exit);	}
     
    #******************************************	
     
    my $filename = get("$PharmPage");
     
    #Parser
    my $parser = HTML::Parser->new(start_h => [\&start_rtn,"tag, attr"],
                    text_h => [\&text_rtn, "text"],
                    end_h => [\&end_rtn, "tag"]);
     
     
    sub start_rtn { 
     
       	my ($tag, $attr) = @_;
     
    	if ($tag =~ /^title$/){														
                 	$flag = 1;										
    	}
    	if ($tag =~ /^a$/ and defined $attr->{href}  and $attr->{href} =~ /^\/do\/serve\?objId=PA[0-9]+&objCls=Gene$/){	
    		$flag = 2;
    	}
    	if ($tag =~ /^a$/ and defined $attr->{href}  and $attr->{href} =~ /^\/do\/serve\?objId=PA[0-9]+&objCls=Disease$/){	
    		$flag = 3;
    	}
    	if ($tag =~ /^a$/ and defined $attr->{href}  and $attr->{href} =~ /^\/do\/serve\?objId=PA[0-9]+&objCls=Drug$/){	
    		$flag = 4;
    	}				
    }
     
    sub text_rtn {
     
    	my ($text) = @_;
    	$text =~ s/\n//g;
     
    	if($flag == 1){				
    		print "Le titre : $text \n";
    	}
    	if($flag == 2){
    		print "Genes relatifs : $text \n";
    	}
    	if($flag == 3){
    		print "Maladies relatives : $text \n";
    	}
    	if($flag == 4){
    		print "Médicaments relatifs : $text \n";
    	}				
    }
     
    sub end_rtn {
         my ($tag) = @_;
     
    	if ($tag =~ /^\/title$/){
                    $flag = 0;
    	}
    	if ($tag =~ /^\/a$/ && ($flag==2 ||$flag==3 || $flag==4)){
    		$flag = 0;
    	}
    }
     
    #start parsing
    $parser->parse($filename);
     
    #end parser
    $parser ->eof;
    Il m'affiche bien les premières instructions, cependant il parse pas le fichier $filename et me ressort pas les informations souhaitées.

    Je tape dans ma console le nom de mon programme, avec comme argument
    $Role et $Code (mis dans le tableau @ARGV), Si il reconnait des noms de roles et de codes précis, Ces 2 variables sont ajouter dans l'adresse URL, et je sort une adresse URL final $PharmPage, que je veux parser...
    RIEN NE N'AFFICHE !!!
    De plus on m'indique en erreur :

    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
    PA50
    Gene
    PA50 + Gene
    http://www.pharmgkb.org/do/serve?objId=PA50&objCls=Gene
    Use of uninitialized value in subroutine entry at Essai_2.pl line 149 (#1)
        (W uninitialized) An undefined value was used as if it were already
        defined.  It was interpreted as a "" or a 0, but maybe it was a mistake.
        To suppress this warning assign a defined value to your variables.
     
        To help you figure out what was undefined, perl tells you what operation
        you used the undefined value in.  Note, however, that perl optimizes your
        program and the operation displayed in the warning may not necessarily
        appear literally in your program.  For example, "that $foo" is
        usually optimized into "that " . $foo, and the warning will refer to
        the concatenation (.) operator, even though there is no . in your
        program.
    La ligne 149 correspond dans mon programme a la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $parser->parse($filename);
    Merci pour vos réactions

  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
    Tu appelles get avec le contenu d'une page html comme argument (et non pas une url)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $filename = get("$PharmPage");
    De ce fait $filename ne contient sûrement pas ce que tu crois.

    Ne veux-tu pas en fait plutôt parser $PharmPage ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $parser->parse($PharmPage);
    PS : Pense à passer le post en "résolu", quand tes problèmes sont résolus.

  3. #3
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 99
    Par défaut
    J'ai fait quelques modifications comme tu m'as indiqué.

    Voici a présent mon code :

    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
    #!/usr/bin/perl
     
     
    use warnings;
    use HTML::Form;
    use LWP::Simple;
    use HTML::Parser();
    use HTML::LinkExtor;
     
     
    #Constants
    my $baseUrl = 'http://www.pharmgkb.org/do/serve?objId=';
     
    #Variables :
    my $flag = 0;
    my $URL;
    my $Role;
    my $Code;
    my $PharmPage = '';
     
     
    ($#ARGV == 1) or die $!;
     
    $Role = $ARGV[0];
    $Code = $ARGV[1];
     
    print "$Code\n";
    print "$Role\n";
     
    #******************************************
     
    if ($Role eq 'Gene'){
    	print "$Code + Gene\n"; 		#Vérifie $Code
    	my $URL = $baseUrl.$Code."&objCls=$Role";
    	print "$URL\n";				#Vérifie $URL
    	my $PharmPage = get("$URL");
    	#print "$PharmPage\n";				#Print le code Source entierement (vérification)
     
    }
     
    elsif ($Role eq 'Drug') {
    	print "$Code + Drug\n";
    	my $URL = $baseUrl.$Code."&objCls=$Role";
    	print "$URL\n";
    	my $PharmPage = get("$URL");
     
    }
    elsif ($Role eq 'Disease') {
    	print "$Code + Disease\n";
    	my $URL = $baseUrl.$Code."&objCls=$Role";
    	print "$URL\n";
    	my $PharmPage = get("$URL");
     
    }
    else {(exit);	}
     
    #******************************************	
     
    #Parser
    my $parser = HTML::Parser->new(start_h => [\&start_rtn,"tag, attr"],
                    text_h => [\&text_rtn, "text"],
                    end_h => [\&end_rtn, "tag"]);
     
     
    sub start_rtn { 
     
       	my ($tag, $attr) = @_;
     
    	if ($tag =~ /^title$/){														
                 	$flag = 1;										
    	}
    	if ($tag =~ /^a$/ and defined $attr->{href}  and $attr->{href} =~ /^\/do\/serve\?objId=PA[0-9]+&objCls=Gene$/){	
    		$flag = 2;
    	}
    	if ($tag =~ /^a$/ and defined $attr->{href}  and $attr->{href} =~ /^\/do\/serve\?objId=PA[0-9]+&objCls=Disease$/){	
    		$flag = 3;
    	}
    	if ($tag =~ /^a$/ and defined $attr->{href}  and $attr->{href} =~ /^\/do\/serve\?objId=PA[0-9]+&objCls=Drug$/){	
    		$flag = 4;
    	}				
    }
     
    sub text_rtn {
     
    	my ($text) = @_;
    	$text =~ s/\n//g;
     
    	if($flag == 1){				
    		print "Le titre : $text \n";
    	}
    	if($flag == 2){
    		print "Genes relatifs : $text \n";
    	}
    	if($flag == 3){
    		print "Maladies relatives : $text \n";
    	}
    	if($flag == 4){
    		print "Médicaments relatifs : $text \n";
    	}				
    }
     
    sub end_rtn {
         my ($tag) = @_;
     
    	if ($tag =~ /^\/title$/){
                    $flag = 0;
    	}
    	if ($tag =~ /^\/a$/ && ($flag==2 ||$flag==3 || $flag==4)){
    		$flag = 0;
    	}
    }
     
    #start parsing
    $parser->parse($PharmPage);
     
     
    #end parser
    $parser ->eof;
    Mais dans ma console, on m'affiche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    perl -Mdiagnostics Essai_2.pl Gene PA227
     
    PA227
    Gene
    PA227 + Gene
    http://www.pharmgkb.org/do/serve?objId=PA227&objCls=Gene
    Je ne comprend pas pourquoi aucune informations ne s'affichent, en sachant que le parsage fonctionne avec une adresse URL fixe donné en paramètre !!!

  4. #4
    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
    Bien sûr, ça ne peut pas aller : tu localises $URL et $PharmaPage dans tes if. Donc leur attribution ne vaut que dans le bloc et dans ton main ils n'ont pas de valeur.

    Enlève les my dans tes if.

    Tu peux aussi réécrire tes if plus joliment

    Aarg... et en plus tu n'utilise pas le pragma strict (ce qui t'aurait permis de voir le problème tout de suite, soit dit en passant)

  5. #5
    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
    Tiens j'ai nettoyé un peu ton code (on peut faire mieux). Tu y verras peut être un peu plus clair.
    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
    #!/usr/bin/perl
    use strict; 
    use warnings;
     
    use HTML::Parser;
    use LWP::Simple;
     
    my $baseurl = 'http://www.pharmgkb.org/do/serve?objId=';
    my $flag = 0;
     
     
    die "usage: $0 role code\n"
        if @ARGV != 2;
     
    my $role = $ARGV[0];
    my $code = $ARGV[1];
     
    print "$code\n";
    print "$role\n";
     
     
    die "not a valid a role\n"
        if $role ne ('Gene' || 'Drug' || 'Disease');
     
    my $url = $baseurl.$code.'&objCls='.$role;
    my $page = get($url);
     
     
    #Parser
     
    my $parser = HTML::Parser->new(start_h => [\&start_rtn,"tag, attr"],
                    text_h => [\&text_rtn, "text"],
                    end_h => [\&end_rtn, "tag"]
                    );
     
    sub start_rtn {
     
            my ($tag, $attr) = @_;
        if ($tag =~ /^title$/){
            $flag = 1;
        }
     
        if ($tag =~ /^a$/ 
            and defined $attr->{href}  
            and $attr->{href} =~ /^\/do\/serve\?objId=PA[0-9]+&objCls=Gene$/
        ){    
            $flag = 2;
        }
     
        if ($tag =~ /^a$/ and defined $attr->{href}  
            and $attr->{href} =~ /^\/do\/serve\?objId=PA[0-9]+&objCls=Disease$/
        ){    
            $flag = 3;
        }
     
        if ($tag =~ /^a$/ and defined $attr->{href}  
            and $attr->{href} =~ /^\/do\/serve\?objId=PA[0-9]+&objCls=Drug$/
        ){    
            $flag = 4;
        }                
    }
     
    sub text_rtn {
     
        my ($text) = @_;
        $text =~ s/\n//g;
     
        if($flag == 1){                
            print "Le titre : $text \n";
        }
        if($flag == 2){
            print "Genes relatifs : $text \n";
        }
        if($flag == 3){
            print "Maladies relatives : $text \n";
        }
        if($flag == 4){
            print "Médicaments relatifs : $text \n";
        }                
    }
     
    sub end_rtn {
         my ($tag) = @_;
     
        if ($tag =~ /^\/title$/){
                    $flag = 0;
        }
        if ($tag =~ /^\/a$/ && ($flag==2 || $flag==3 || $flag==4)){
            $flag = 0;
        }
    }
     
    #start parsing
    $parser->parse($page);
     
    #end parser
    $parser ->eof;

  6. #6
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 99
    Par défaut Remerciements
    OUAAA !!!

    Parfait cela marche dans tes 2 cas !!!

    Je te remercie beaucoup pour toutes tes aides

Discussions similaires

  1. [MySQL] Problème de parsage d'un fichier xml de 12 Go
    Par totoAussi dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 27/08/2011, 00h40
  2. Problème de parsage en Json
    Par Flow_75 dans le forum Android
    Réponses: 4
    Dernier message: 26/06/2011, 19h17
  3. problème de parsage
    Par perloutta dans le forum Android
    Réponses: 15
    Dernier message: 14/04/2011, 09h40
  4. Problème de parsage dans un "parsage"
    Par stansoad0108 dans le forum Langage
    Réponses: 3
    Dernier message: 22/04/2008, 10h17
  5. Réponses: 3
    Dernier message: 07/06/2007, 13h22

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