Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Extraction d'un texte de X à Y

8 réponses
Avatar
Crayos
Bonjour =E0 tous,

J'ai un souci avec un script pour extraire un texte de X jusqu=E0 Y.
Pour faciliter ma question je vais utiliser un exemple de texte html

Donc je souhaite extraire un bout d'un texte html soit de <body> =E0
</html> Notez au passage que ce pourait =EAtre d'autres tags ou des mots
tout simplement de toto =E0 titi.

J'ai pour cela le script suivant:

$depart =3D "<body>";
$fin =3D "</html>";
$depart_length =3D length $depart;

open(FILE, "fichier.html") || die "I can't read that file\n";
undef $/;
chomp($file_body=3D <FILE>);
close FILE;

$file_depart =3D index($file_body,$depart);
$file_fin =3D index($file_body,$fin);
$Texte_voulu =3D substr($file_body,$file_depart + $depart_length,$fin -
($file_depart + $depart_length));


print "$Texte_voulu";
##############################

Si le premier mot de $depart (<body>)est extrait au bon endroit, par
contre le mot de $fin (</html>)est toujours faux. En r=E9sum=E9 le script
n'extrait pas de <body> =E0 </html> mais de <body> =E0 ??? bien avant la
fin de la page.
En r=E9sum=E9 n'y a t'il pas moyen d'extraire un texte de X =E0 Y ?

Dans le cas pr=E9sent c'est comme si le (length $depart;) jouait un
r=F4le dans la longeur du texte_voulu.

J'ai parcouru toutes les archives fr.comp.lang.perl. sans touver une
solution.

Pouvez-vous m'aider.

Cordialement
Ger@ld

8 réponses

Avatar
Damien GUERIN
Moi je ferais plutot :

$depart = "<body>";
$fin = "</html>";
$debut_trouve=0;
open(FILE, "fichier.html") || die "I can't read that filen";
while (my $ligne=<FILE>) {
if ($ligne = ~ /E$departq/ ) {
$debut_trouve=1;
} elsif ($ligne = ~ /E$finq/ ) {
last;
} elsif ($debut_trouve) {
print $ligne;
}
}
close(FILE);



"Crayos" a écrit dans le message de news:

Bonjour à tous,

J'ai un souci avec un script pour extraire un texte de X jusquà Y.
Pour faciliter ma question je vais utiliser un exemple de texte html

Donc je souhaite extraire un bout d'un texte html soit de <body> à
</html> Notez au passage que ce pourait être d'autres tags ou des mots
tout simplement de toto à titi.

J'ai pour cela le script suivant:

$depart = "<body>";
$fin = "</html>";
$depart_length = length $depart;

open(FILE, "fichier.html") || die "I can't read that filen";
undef $/;
chomp($file_body= <FILE>);
close FILE;

$file_depart = index($file_body,$depart);
$file_fin = index($file_body,$fin);
$Texte_voulu = substr($file_body,$file_depart + $depart_length,$fin -
($file_depart + $depart_length));


print "$Texte_voulu";
##############################

Si le premier mot de $depart (<body>)est extrait au bon endroit, par
contre le mot de $fin (</html>)est toujours faux. En résumé le script
n'extrait pas de <body> à </html> mais de <body> à ??? bien avant la
fin de la page.
En résumé n'y a t'il pas moyen d'extraire un texte de X à Y ?

Dans le cas présent c'est comme si le (length $depart;) jouait un
rôle dans la longeur du texte_voulu.

J'ai parcouru toutes les archives fr.comp.lang.perl. sans touver une
solution.

Pouvez-vous m'aider.

Cordialement

Avatar
Crayos
Merci mais le script que vous m'avez donné ne fonctionne
malheureusement pas. Meilleures salutations
Avatar
CB
Crayos wrote:
Donc je souhaite extraire un bout d'un texte html soit de <body> à
</html> Notez au passage que ce pourait être d'autres tags ou des mots
tout simplement de toto à titi.



Avec File::Slurp, je charge la totalité du fichier dans un scalaire,
puis supprime les marques de fin de lignes avec une regexp.
Ensuite, il est facile de faire ce que l'on veut sur la chaîne restante.

Mais ce n'est pas beau, pas portable, c'est gourmand en ressources...

CB.

Avatar
Le_T
$seq =~ s/W//g; supprime les non alphanumériques

ensuite hum...

$seq =~ m/(<body>)(.+)(</html>)/i;
print $2;

Pourquoi ne pas essayer?
Avatar
CB
Le_T wrote:
$seq =~ s/W//g; supprime les non alphanumériques


Cela risque de dégager aussi les <, > ...

ensuite hum...

$seq =~ m/(<body>)(.+)(</html>)/i;
print $2;

Pourquoi ne pas essayer?


Pour moi, cela marche bien en tout cas.
J'aurais bien sûr des problèmes s'il fallait reconstruire le fichier
d'origine, avec les sauts de lignes où il faut...
Mais puisque ce n'est pas nécessaire.

CB

Avatar
Le_T
Alors dans ce cas on ne supprime pas les caractères, on ne fait qu'un
match... d'ailleurs il est meme possible que ca fonctionne en gardant
les sauts de ligne... a essayer
Avatar
ZigZag15551
Le problème c'est ta variable $fin dans $Texte_voulu qui devrais être
$file_fin la référence à la position et non la celle du tag recherché.

Ça devrait aller mieux !!! :o)

$Texte_voulu = substr($file_body,$file_depart + $depart_length,$file_fin -
($file_depart + $depart_length));


Zigzag

################################
"Crayos" a écrit dans le message de news:

Bonjour à tous,

J'ai un souci avec un script pour extraire un texte de X jusquà Y.
Pour faciliter ma question je vais utiliser un exemple de texte html

Donc je souhaite extraire un bout d'un texte html soit de <body> à
</html> Notez au passage que ce pourait être d'autres tags ou des mots
tout simplement de toto à titi.

J'ai pour cela le script suivant:

$depart = "<body>";
$fin = "</html>";
$depart_length = length $depart;

open(FILE, "fichier.html") || die "I can't read that filen";
undef $/;
chomp($file_body= <FILE>);
close FILE;

$file_depart = index($file_body,$depart);
$file_fin = index($file_body,$fin);
$Texte_voulu = substr($file_body,$file_depart + $depart_length,$fin -
($file_depart + $depart_length));


print "$Texte_voulu";
##############################

Si le premier mot de $depart (<body>)est extrait au bon endroit, par
contre le mot de $fin (</html>)est toujours faux. En résumé le script
n'extrait pas de <body> à </html> mais de <body> à ??? bien avant la
fin de la page.
En résumé n'y a t'il pas moyen d'extraire un texte de X à Y ?

Dans le cas présent c'est comme si le (length $depart;) jouait un
rôle dans la longeur du texte_voulu.

J'ai parcouru toutes les archives fr.comp.lang.perl. sans touver une
solution.

Pouvez-vous m'aider.

Cordialement


##############################
Avatar
DoMinix
Crayos wrote:
Bonjour à tous,

J'ai un souci avec un script pour extraire un texte de X jusquà Y.
Pour faciliter ma question je vais utiliser un exemple de texte html

Donc je souhaite extraire un bout d'un texte html soit de <body> à
</html> Notez au passage que ce pourait être d'autres tags ou des mots
tout simplement de toto à titi.

J'ai pour cela le script suivant:

$depart = "<body>";
$fin = "</html>";
$depart_length = length $depart;

open(FILE, "fichier.html") || die "I can't read that filen";
undef $/;
chomp($file_body= <FILE>);
close FILE;

$file_depart = index($file_body,$depart);
$file_fin = index($file_body,$fin);
$Texte_voulu = substr($file_body,$file_depart + $depart_length,$fin -
($file_depart + $depart_length));


print "$Texte_voulu";
##############################

Si le premier mot de $depart (<body>)est extrait au bon endroit, par
contre le mot de $fin (</html>)est toujours faux. En résumé le script
n'extrait pas de <body> à </html> mais de <body> à ??? bien avant la
fin de la page.
En résumé n'y a t'il pas moyen d'extraire un texte de X à Y ?

Dans le cas présent c'est comme si le (length $depart;) jouait un
rôle dans la longeur du texte_voulu.

J'ai parcouru toutes les archives fr.comp.lang.perl. sans touver une
solution.

Pouvez-vous m'aider.

Cordialement




perl -n0777le 'print $1 if m{<body>(.*)</html>}is' fichier.html

ça marche pour moi :)

--
dominix