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 :

Correction automatique de plus de 700 pages html


Sujet :

Web Perl

  1. #21
    Nouveau membre du Club
    Inscrit en
    Juillet 2006
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 72
    Points : 38
    Points
    38
    Par défaut
    En vrac:
    Pour le unlink, oui j'ai pas pensé à éditer mais je l'avais corrigé dans mon programme. Pareil pour la confusion $tmp $new_file.

    Sinon tu te contredis pour le File::Temp ou alors j'ai encore pas compris le truc:
    Citation Envoyé par Jedai
    File::Temp est dans le CORE depuis la version 5.6.1
    Merci pour tes explications pour le heredoc mais je ne comprends pas ton exemple là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my $a = <<ENDOFNUM + 2;
    3
    ENDOFNUM
    print $a; # 5
    oui j'essai de faire du CGI.

  2. #22
    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
    Sinon tu te contredis pour le File::Temp ou alors j'ai encore pas compris le truc
    Il y a deux chose différente : être compatible, et être dans le CORE. le CORE est l'ensemble des modules inclus par défaut avec Perl (dans la distribution source officielle de la Perl Foundation, il arrive que les distributions linux fassent leur petit marché, pas toujours judicieusement). File::Temp est dans le CORE depuis la 5.6.1, c'est à dire qu'à partir de cette version on n'a même plus besoin de l'installer pour en profiter, mais le module lui-même est disponible sur le CPAN et est compatible avec tous les Perl depuis la 5.005 .

    Merci pour tes explications pour le heredoc mais je ne comprends pas ton exemple là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my $a = <<ENDOFNUM + 2; 
    3 
    ENDOFNUM 
    print $a; # 5
    Je voulais dire que tu utilisais le heredoc exactement comme une string, et que tu pouvais donc le placer absolument n'importe où, l'exemple ci-dessus est équivalent à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my $a = "3" + 2; 
    print $a; # 5
    --
    Jedaï

  3. #23
    Nouveau membre du Club
    Inscrit en
    Juillet 2006
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 72
    Points : 38
    Points
    38
    Par défaut
    Ok merci. Tout est clair grâce à toi.

  4. #24
    Nouveau membre du Club
    Inscrit en
    Juillet 2006
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 72
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par Jedai
    Il y a deux chose différente : être compatible, et être dans le CORE. le CORE est l'ensemble des modules inclus par défaut avec Perl (dans la distribution source officielle de la Perl Foundation, il arrive que les distributions linux fassent leur petit marché, pas toujours judicieusement). File::Temp est dans le CORE depuis la 5.6.1, c'est à dire qu'à partir de cette version on n'a même plus besoin de l'installer pour en profiter, mais le module lui-même est disponible sur le CPAN et est compatible avec tous les Perl depuis la 5.005 .
    J'ai été sur le CPAN mais à chaque fois c'est des versions pour Unix et apparement la version windows serait encore instable.

  5. #25
    Nouveau membre du Club
    Inscrit en
    Juillet 2006
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 72
    Points : 38
    Points
    38
    Par défaut
    Hop encore une question. Dans un fichier html j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <optgroup label="">
         <option>1.toto</option>
         <option>2.tata</option>
         <option>3.tete</option>
    <optgroup>
    et j'aimerais le transformer en une série de lien du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href=page1.html title="1.toto" > 1.toto</a>
    donc j'ai pensé à une truc du genre (juste j'ai fait un open comme d'hab avant)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     while (my $line = <$old_file>) {
        if ($line= ~m/^\s*<optgroup label="">\*s/) {
            my $compteur_group = 0;
            while ($line= !~m/^<optgroup>/) {
                $line++; #comment passer à la ligne suivante?
                $line= ~s/<option>|</option>/; #ne laisse dans la ligne que 1.toto
                $compteur_group++ 
                 print $new_file "<a href=page.$compteur_group\.html title=\"$line\">$line</a>" ;
             }
         }
     }

    Mais ça me parait pas très beau et je suis pas sûr pour ma dernière ligne.

  6. #26
    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 Petitcodeur
    J'ai été sur le CPAN mais à chaque fois c'est des versions pour Unix et apparement la version windows serait encore instable.
    Ca serait bien de lire notre FAQ sur l'installation de module...
    Des versions pour Unix ? Et c'est écris où exactement ? C'est un module pur Perl, et parfaitement multiplateforme. La version Windows est si instable qu'elle est incluse dans ActivePerl alors bon...

    --
    Jedaï

  7. #27
    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 Petitcodeur
    Hop encore une question. Dans un fichier html j'ai
    ...
    Mais ça me parait pas très beau et je suis pas sûr pour ma dernière ligne.
    Il y a des fautes de syntaxes, le programme ne fait pas ce que tu veux et il est très fragile.
    Je te conseille lorsque tu commences à avoir ce type d'exigence de passer carrément à des parsers HTML, ce sera beaucoup plus simple et efficace.

    --
    Jedaï

  8. #28
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    j'ai pas lu toutes les reponses, mais pour ce que tu veux faire, je te suggere d'utiliser html::parser.

  9. #29
    Nouveau membre du Club
    Inscrit en
    Juillet 2006
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 72
    Points : 38
    Points
    38
    Par défaut
    Je dois donc installer/utiliser ? J'ai lu vite fait sur Cpan et j'ai un peu rien compris.

    Sinon comment on fait pour dire d'aller à la ligne suivante?

    edit: ah bah j'avais pas vu la réponse de Djibril.

  10. #30
    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
    Je pense que HTML::TokeParser te sera peut-être un peu plus compréhensible : c'est un module qui utilise HTML::Parser mais présente une interface de flux de tokens, un peu comme avant tu lisais ligne par ligne, là tu vas lire token par token, ce qui est plus facile pour manipuler du HTML.

    --
    Jedaï

  11. #31
    Nouveau membre du Club
    Inscrit en
    Juillet 2006
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 72
    Points : 38
    Points
    38
    Par défaut
    Ah oui là je crois avoir compris. Je vous met le code pour ce que je veux faire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $p=HTML::TokeParser -> new("toto.html")||die "Can't open: $!";
    my cpt_tok=0;
    while (my $tok = $p>get_tag("option")) {
    	my$text= $p->get_trimmed_text("/option");
            ctp_tok++
    	print $new_file "<a href=page$cpt_tok.html title=\"$text\">$texte</a>";
    }


    Sinon encore une question de noob, HTML::TokeParser, je dois l'installer comme pour File::Temp?

  12. #32
    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 Petitcodeur
    Sinon encore une question de noob, HTML::TokeParser, je dois l'installer comme pour File::Temp?
    Tu as lu notre FAQ ? Si la question était "Est-ce que HTML::TokeParser est dans le CORE ?", la réponse est non (mais tu l'as peut-être quand même, vérifie), et tu peux facilement savoir si tu as un module ou pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    perl -MHTML::TokeParser -e ""
    S'il ne te dit rien c'est que tu as le module.

    --
    Jedaï

  13. #33
    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 Petitcodeur
    Sinon comment on fait pour dire d'aller à la ligne suivante?
    On lit une ligne de plus, dans ton cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $line = <$old_file>;
    --
    Jedaï

  14. #34
    Nouveau membre du Club
    Inscrit en
    Juillet 2006
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 72
    Points : 38
    Points
    38
    Par défaut
    Oui ma question était pour savoir si c'était dans le Core ou pas. Excuse moi si je me suis mal exprimé.

    edit: dans le cas où le code que je propose plus haut est juste. Ca marche aussi pour les caractères type é ou è ("&eacute;", ...)?

  15. #35
    Nouveau membre du Club
    Inscrit en
    Juillet 2006
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 72
    Points : 38
    Points
    38
    Par défaut
    Personne pour me dire si j'ai bien compris le HTML::TokeParser ou si je suis complètement à la masse?

  16. #36
    Nouveau membre du Club
    Inscrit en
    Juillet 2006
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 72
    Points : 38
    Points
    38
    Par défaut
    Je sais que je suis chiant mais j'aimerais bien continuer et c'est pas la peine si je fais complètement fausse route.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    use HTML::TokeParser;
      $p = HTML::TokeParser->new(shift||"index.html");
     
      while (my $token = $p->get_tag("a")) {
          my $url = $token->[1]{href} || "-"; <<<<si quelqu'un voulait bien m'expliquer cette ligne je lui en serais très reconnaissant aussi.
          my $text = $p->get_trimmed_text("/a");
          print "$url\t$text\n";
      }

  17. #37
    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 Petitcodeur
    Ah oui là je crois avoir compris. Je vous met le code pour ce que je veux faire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $p=HTML::TokeParser -> new("toto.html")||die "Can't open: $!";
    my cpt_tok=0;
    while (my $tok = $p>get_tag("option")) {
    	my$text= $p->get_trimmed_text("/option");
            ctp_tok++
    	print $new_file "<a href=page$cpt_tok.html title=\"$text\">$texte</a>";
    }
    Tu ne recopie dans le nouveau fichier que la partie modifiée, pas le reste du fichier...
    Tu dois raisonner comme avec les modifications de lignes, c'est à dire lire token par token et toujours recopier le token, éventuellement modifié. (Mais comme tu avais également fait cette erreur dans ta dernière proposition ligne par ligne, au moins tu es cohérent...)

    Voilà une solution :
    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
     
    my ($in_optgroup, $in_option);
    while ( my $tok = $p->get_token() ) {
      my $type = $p->[0];
      # récupérer le code source du token
      my $text= $p->[-1];
      $text = $p->[-2] if $type eq 'T';
     
      if( $type eq 'S' and $p->[1] eq 'optgroup' and $p->[2]{label} eq "" ){
        $text = "";
        $in_optgroup++;
      }
     
      elsif( $type eq 'E' and $p->[1] eq '/optgroup' and $in_optgroup ){
        $text = "";
        $in_optgroup--;
      }
     
      elsif( $type eq 'S' and $p->[1] eq 'option' and $in_optgroup ){
        $text = "";
        $in_option++;
      }
     
      elsif( $type eq 'E' and $p->[1] eq '/option' and $in_option ){
        $text = "";
        $in_option--;
      } 
     
      elsif( $type eq 'T' and $in_option ){
        my ($digit) = ($text =~ m/^\s*(\d+)/);
        $text = qq(<a href=page$digit.html title="$text">$text</a>);
      } 
     
      print {$new_file} $text;
    }
    Quelque chose comme ça. (Avec HTML:: Parser on pourrait faire plus compact, mais si tu as du mal avec les parsers par callbacks, oublie ça)

    --
    Jedaï

  18. #38
    Nouveau membre du Club
    Inscrit en
    Juillet 2006
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 72
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par Jedai
    Tu ne recopies dans le nouveau fichier que la partie modifiée, pas le reste du fichier...
    J'ai peut-être mal compris mais c'est exactement ce que je veux vu que je fais d'autres modifications ailleurs sur ce fichier.


    Citation Envoyé par Jedai
    Tu dois raisonner comme avec les modifications de lignes, c'est à dire lire token par token et toujours recopier le token, éventuellement modifié. (Mais comme tu avais également fait cette erreur dans ta dernière proposition ligne par ligne, au moins tu es cohérent...)
    J'ai pas compris ('ai l'impression d'être super idiot). Dans le cas de <optgroup> et <option>, je les veux pas donc pourquoi les recopier?
    [edit] Ah mais oui je suis vraiment débile c'est comme le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $line = blablba;
    print $tmp $line;
    [/edit]
    Sinon merci de ta patience, je crois que les autres ont laissé tomber avec moi

    Enfin une question pratique sur le forum, il vaut mieux faire un gros sujet comme j'ai fait avec plein de petites questions en rapport ou plutôt faire plusieurs petits sujets sur des questions précises?

    Encore merci pour ton aide.

  19. #39
    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 Petitcodeur
    J'ai peut-être mal compris mais c'est exactement ce que je veux vu que je fais d'autres modifications ailleurs sur ce fichier.
    Et ensuite tu fais quoi ? Tu recopie la partie modifiée à la place de la totalité du fichier ? Le principe ici est celui d'un filtre : tu fais entrer le document par un bout, tu le lis élément par élément, ceux que tu ne veux pas modifier tu les laisse passer, ceux que tu veux modifier tu les modifies avant de les laisser passer, et à l'autre bout du filtre tu réécris tout dans le fichier.

    Citation Envoyé par Petitcodeur
    J'ai pas compris ('ai l'impression d'être super idiot). Dans le cas de <optgroup> et <option>, je les veux pas donc pourquoi les recopier?
    <option> et </optgroup> ne sont pas recopiés, tu vois le '$text = "";' dans ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if( $type eq 'S' and $p->[1] eq 'optgroup' and $p->[2]{label} eq "" ){
        $text = "";
        $in_optgroup++;
      }
    --
    Jedaï

  20. #40
    Nouveau membre du Club
    Inscrit en
    Juillet 2006
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 72
    Points : 38
    Points
    38
    Par défaut
    Bon un dernier truc que je comprends pas c'est tes variables $in_optgroup et $in_option.
    Je vois pas du tout à quoi elles servent et par conséquent je bloque sur ta soluce.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. creation automatique de liens dans une page html
    Par arrakis75 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 22/09/2010, 10h08
  2. scroll automatique ( jscript je suppose) de page html
    Par xini dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 31/12/2006, 19h17
  3. Réponses: 6
    Dernier message: 12/06/2006, 20h03
  4. Appeller 2 pages HTML ou plus
    Par vins25 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 24
    Dernier message: 06/01/2006, 13h01
  5. [INFO]Génération automatique de pages HTML
    Par GreenJay dans le forum API standards et tierces
    Réponses: 6
    Dernier message: 28/09/2005, 16h29

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