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

Probleme extraction données

6 réponses
Avatar
Fabrice L.
Bonjour,

Dans une requete LWP, je recupere ce bout de code HTML (ce n'est pas celui
la, mais c'est architecturé de facon identique)
j'aimerai sortir les infos qui m'interesse mais je coince.

Le code :

<TABLE>
<TR>
<TD colspan="2">9.01.08</TD>
</TR>
<TR>
<TD>9:00</TD>
<TD>bla bla</TD>
</TR>
<TR>
<TD>9:10</TD>
<TD>ble ble</TD>
</TR>
<TR>
<TD>9:15</TD>
<TD>bli bli</TD>
</TR>

<TR>
<TD colspan="2">10.01.08</TD>
</TR>
<TR>
<TD>9:00</TD>
<TD>bla bla</TD>
</TR>
<TR>
<TD>9:10</TD>
<TD>ble ble</TD>
</TR>
<TR>
<TD>9:15</TD>
<TD>bli bli</TD>
</TR>
<TR>
<TD>9:20</TD>
<TD>blo blo</TD>
</TR>
</TABLE>

et moi je veux sortir comme resultat :
9.01.08 9:00 bla bla
9.01.08 9:10 ble ble
9.01.08 9:15 bli bli
10.01.08 9:00 bla bla
10.01.08 9:10 ble ble
10.01.08 9:15 bli bli
10.01.08 9h20 blo blo

je sais recuperer chaque jour
ou je sais recuperer chaque heure et texte mais pas y adjoindre la date...

une idée ?
merci d'avance
Fabrice

6 réponses

Avatar
Thomas vO
bonjour,

À (at) Tue, 8 Jan 2008 15:16:26 +0100,
"Fabrice L." nous disait (told us):
je sais recuperer chaque jour
ou je sais recuperer chaque heure et texte mais pas y adjoindre la date...

une idée ?


comme ça, à froid, je suggérerai XML::Twig, mais il n'est pas
impossible qu'un autre module existe, plus adapté au HTML...

hope that'll help,

--
Thomas vO - <http://perso.enstimac.fr/~vanouden/>

Avatar
Fabrice L.
Au final j'aimerai le faire sans module externe, a moins que ce soit la
seule solution !
en fait, je lis la page recuperer avec LWP::Simple avec un : while ($page =~
etc....) { $date = $1; $info = $2; }
mais ca ne m'avance pas car dans ce cas de figure je ne recupere que la date
et la premiere info.
Dans une autre requete je peux recuperer toutes les infos ou toutes les
dates, mais je n'arrive pas chronologiquement a recuperer :
1. La date
2. les infos
3. les infos
4. une eventuelle autre date
5. les infos
6. une eventuelle autre date
7. les infos
8. les infos
9. les infos

etc... et ce en un seul traitement de la page web recuperée (et meme en
plusieurs traitements)

Concretement je fais ainsi (en adaptant mon code a l'exemple fourni)

while ($page =~ m# <TD colspan="2">([^<]+)</TD>#sog) { $date = $1; }
while ($page =~ m#<TD>([^<]+)</TD>#sog) { $infos = $1; print "$date
$infos<BR>"; }

mais ca ne vas pas....
une idée, un bout de code, je suis preneur.

merci,
Fabrice





"Thomas vO" <vanouden+ a écrit dans le message de
news:
bonjour,

À (at) Tue, 8 Jan 2008 15:16:26 +0100,
"Fabrice L." nous disait (told us):
je sais recuperer chaque jour
ou je sais recuperer chaque heure et texte mais pas y adjoindre la
date...



une idée ?


comme ça, à froid, je suggérerai XML::Twig, mais il n'est pas
impossible qu'un autre module existe, plus adapté au HTML...

hope that'll help,

--
Thomas vO - <http://perso.enstimac.fr/~vanouden/>



Avatar
Paul Gaborit
À (at) Tue, 8 Jan 2008 17:19:14 +0100,
"Fabrice L." écrivait (wrote):
Au final j'aimerai le faire sans module externe, a moins que ce soit la
seule solution !


Pour être sûr du résultat, c'est nécessaire. Mais pour traiter une
page dont le HTML a une forme bien spécifique et qui ne risque pas de
changer, on peut s'en passer....

Concretement je fais ainsi (en adaptant mon code a l'exemple fourni)

while ($page =~ m# <TD colspan="2">([^<]+)</TD>#sog) { $date = $1; }
while ($page =~ m#<TD>([^<]+)</TD>#sog) { $infos = $1; print "$date
$infos<BR>"; }


On peut utiliser une seule expression rationnelle qui reconnaît tout
(avec un 'ou') :

while ($page =~
m#(<TD colspan="2">)([^<]+)</TD>|(<TD>)([^<]+)</TD>#sog) {
if ($1 eq 'TD colspan="2"') {
$date = $2;
} else {
$info = $2;
print "$date $infon";
}
}

Là, j'ai bêtement mis bout à bout les deux expressions rationnelles
initiales en les liant en une alternative (|). On peut évidemment
optimiser l'expression rationnelle globale :

while ($page =~
m#<TD( colspan="2"|)>)([^<]+)</TD>#sog) {
if ($1 ne '') {
$date = $2;
} else {
$info = $2;
print "$date $infon";
}
}

(codes pas testés mais l'idée est là...)

PS: même si ça ne gêne pas, le modificateur /o est ici inutile car
l'expression rationnelle ne contient pas de variables... De même, le
modificateur /s est inutile puisque l'expression rationnelle n'utilise
pas de '.'.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
Fabrice L.
deja merci ! ce n'est pas la premiere fois que vous m'aidez et a chaque
fois, vos lumieres me sont précieuses !
cependant la, ca ne fonctionne pas :

J'ai utilisé la 2eme soluce

$page = <<"EOM";
<TABLE>
<TR>
<TD colspan="2">9.01.08</TD>
</TR>
<TR>
<TD>9:00</TD>
<TD>bla bla</TD>
</TR>
(couic....)
</TR>
<TR>
<TD colspan="2">10.01.08</TD>
</TR>
<TR>
<TD>9:00</TD>
<TD>bla bla</TD>
</TR>
(re couic...)
<TR>
<TD>9:20</TD>
<TD>blo blo</TD>
</TR>
</TABLE>
EOM

while ($page =~ m#<TD( colspan="2"|)>([^<]+)</TD>#sog) {
if ($1 ne '') { $date = $2; }
else {
$info = $2;
print "$date $info<BR>";
}
}

et le resultat donne :
9.01.08 9:00
9.01.08 bla bla
9.01.08 9:10
9.01.08 ble ble
9.01.08 9:15
9.01.08 bli bli
10.01.08 9:00
10.01.08 bla bla
10.01.08 9:10
10.01.08 ble ble
10.01.08 9:15
10.01.08 bli bli
10.01.08 9:20
10.01.08 blo blo

alors que l'escompté est :
9.01.08 9:00 bla bla
9.01.08 9:10 ble ble
etc....

je nage !
PS le premiere exemple lui ne marche pas du tout mais j'ai compris l'idée,
c'est deja la le principal but !
Avatar
Paul Gaborit
À (at) Tue, 8 Jan 2008 18:33:44 +0100,
"Fabrice L." écrivait (wrote):
cependant la, ca ne fonctionne pas :

J'ai utilisé la 2eme soluce
[...]


et le resultat donne :
9.01.08 9:00
9.01.08 bla bla
[...]


C'est parce que mon exemple de code se base sur votre deuxième message
pour donner l'idée de la méthode...

Voici un code qui marche dans la mesure où :

1- toutes les infos sont uniquement dans les éléments TD.
2- les éléments TD contiennent toujours une info qui vous intéresse.
3- les dates sont toujours sous la forme jj.mm.aa
4- les heures sont toujours sous la forme hh:mm

my $date = "pas de date";
my $heure = "pas d'heure";
while ($page =~ m{<TD.*?>(.+?)</TD>}g) {
# on a reconnu un élément TD
my $contenu = $1;
if ($contenu =~ m/^d+.d+.d+$/) { # est-ce une date ?
$date = $contenu;
} elsif ($contenu =~ m{^d+:d+$}) { # ou une heure
$heure = $contenu;
} else { # ce n'est ni une date ni une heure...
print "$date $heure $contenun";
}
}

Mais, il est impossible de vérifier que ça marchera à tous les coups
sans voir vos données réelles.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
Fabrice L.
Merci de votre nouvelle réponse,

entre temps (je n'ai vu votre derniere reponse que maintenant : 21h16) j'ai
réussi a faire ce que je voulais en me basant sur votre 1ere réponse et en
adaptant par rapport aux données réels qui, a posteriori, n'avait guere de
rapport avec celles de mon exemple (idiot que je suis !)

Bref, la ligne de conduite que vous m'avez proroposé m'a tout de meme permis
d'arriver a mes fins, ce qui, somme toute, est le principal !

Merci bcp, bcp, bcp !

Fabrice

"Paul Gaborit" a écrit dans le message de
news:

À (at) Tue, 8 Jan 2008 18:33:44 +0100,
"Fabrice L." écrivait (wrote):
cependant la, ca ne fonctionne pas :

J'ai utilisé la 2eme soluce
[...]


et le resultat donne :
9.01.08 9:00
9.01.08 bla bla
[...]


C'est parce que mon exemple de code se base sur votre deuxième message
pour donner l'idée de la méthode...

Voici un code qui marche dans la mesure où :

1- toutes les infos sont uniquement dans les éléments TD.
2- les éléments TD contiennent toujours une info qui vous intéresse.
3- les dates sont toujours sous la forme jj.mm.aa
4- les heures sont toujours sous la forme hh:mm

my $date = "pas de date";
my $heure = "pas d'heure";
while ($page =~ m{<TD.*?>(.+?)</TD>}g) {
# on a reconnu un élément TD
my $contenu = $1;
if ($contenu =~ m/^d+.d+.d+$/) { # est-ce une date ?
$date = $contenu;
} elsif ($contenu =~ m{^d+:d+$}) { # ou une heure
$heure = $contenu;
} else { # ce n'est ni une date ni une heure...
print "$date $heure $contenun";
}
}

Mais, il est impossible de vérifier que ça marchera à tous les coups
sans voir vos données réelles.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>