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

[HS] parser du html en shell

10 réponses
Avatar
fabrice régnier
salut la liste ;)

je cherche à parser la balise <A variables_de_la balise >blabla</A> et à
récupérer le contenu blabla.
Grep ne fait pas ce que je veux car il me donne toute la ligne où
apparait <A>.

J'ai bien testé avec awk quelque chose du genre:
cat mon_fichier_html | awk awk -F"<A" '{print $1}' mais je ne sais pas
comment lui indiquer la fin de la balise </A>

Des idées ?

merci et a+

f.

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists Vous pouvez aussi ajouter le mot
``spam'' dans vos champs "From" et "Reply-To:"

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers debian-user-french-REQUEST@lists.debian.org
En cas de soucis, contactez EN ANGLAIS listmaster@lists.debian.org

10 réponses

Avatar
serge
Le Sunday 12 July 2009 19:36:32 fabrice régnier, vous avez écrit :
salut la liste ;)

je cherche à parser la balise <A variables_de_la balise >blabla</A> et à
récupérer le contenu blabla.
Grep ne fait pas ce que je veux car il me donne toute la ligne où
apparait <A>.

J'ai bien testé avec awk quelque chose du genre:
cat mon_fichier_html | awk awk -F"<A" '{print $1}' mais je ne sais pas
comment lui indiquer la fin de la balise </A>

Des idées ?

merci et a+

f.


Par exemple avec Perl:

% cat blabla.html |
perl -W -e 'while (<>){print "$1n" if (/<a(.*?)</a/oi);};'

--
S e r g e

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists Vous pouvez aussi ajouter le mot
``spam'' dans vos champs "From" et "Reply-To:"

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Avatar
Alexandre
Le dimanche 12 juillet de l'année 2009, vers 20 heures et 58 minutes, écrivait:
Le Sunday 12 July 2009 19:36:32 fabrice régnier, vous avez écrit :
> salut la liste ;)



Bonjour,

> je cherche à parser la balise <A variables_de_la balise >blabla</A> et à
> récupérer le contenu blabla.
> Grep ne fait pas ce que je veux car il me donne toute la ligne où
> apparait <A>.
>
> J'ai bien testé avec awk quelque chose du genre:
> cat mon_fichier_html | awk awk -F"<A" '{print $1}' mais je ne sais pas
> comment lui indiquer la fin de la balise </A>
>
> Des idées ?
>
> merci et a+
>
> f.
Par exemple avec Perl:

% cat blabla.html |
perl -W -e 'while (<>){print "$1n" if (/<a(.*?)</a/oi);};'



Pour ce genre de chose, j'utilise Perl avec TreeBuilder. Mais bon, dans
un script et donc pas en une seule ligne de commande.

En espérant que cela aide.

--
Alexandre Delanoë

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists Vous pouvez aussi ajouter le mot
``spam'' dans vos champs "From" et "Reply-To:"

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Avatar
Yannick Fouquet
Bonjour à tous,

a écrit :
Le Sunday 12 July 2009 19:36:32 fabrice régnier, vous avez écrit :
je cherche à parser la balise <A variables_de_la balise >blabla</A> et à
récupérer le contenu blabla.


Par exemple avec Perl:

% cat blabla.html |
perl -W -e 'while (<>){print "$1n" if (/<a(.*?)</a/oi);};'



Au cas où cela réponde davantage au besoin,
pour ne récupérer que blabla et pas variables_de_la balise >blabla,
il suffit de modifier à peine l'expression régulière précédente.


% cat blabla.html |
perl -W -e 'while (<>){print "$2n" if (/<a(.*?)>(.*)</a/oi);};'

@+
Yannick.

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists Vous pouvez aussi ajouter le mot
``spam'' dans vos champs "From" et "Reply-To:"

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Avatar
Yves Rutschle
J'ai une question sur ce caractère:

On Tue, Jul 14, 2009 at 09:58:28PM +0200, Yannick Fouquet wrote:
% cat blabla.html |
perl -W -e 'while (<>){print "$2n" if (/<a(.*?)>(.*)</a/oi);};'


^

Il fait quoi ce 'o'? Je ne le trouve pas dans perlre(1).

Merci d'avance,
Y.

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists Vous pouvez aussi ajouter le mot
``spam'' dans vos champs "From" et "Reply-To:"

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Avatar
Yannick Fouquet
Yves Rutschle a écrit :
J'ai une question sur ce caractère:

On Tue, Jul 14, 2009 at 09:58:28PM +0200, Yannick Fouquet wrote:
% cat blabla.html |
perl -W -e 'while (<>){print "$2n" if (/<a(.*?)>(.*)</a/oi);};'


^

Il fait quoi ce 'o'? Je ne le trouve pas dans perlre(1).



Très bonne question. Je ne savais pas, j'ai juste recopié la commande de
Serge. Du coup, j'ai regardé dans perlre, rien. Puis dans perlop :

o Compilation du motif uniquement la première fois.

Je l'ai vu sur le net (pas sur perl.enstimac.fr car le site semble être
down) mais on peut le voir aussi dans le man :

man perlop
ligne 729


@+
Yannick.

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists Vous pouvez aussi ajouter le mot
``spam'' dans vos champs "From" et "Reply-To:"

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Avatar
serge
Le Wednesday 15 July 2009 00:44:38 Yves Rutschle, vous avez écrit :
J'ai une question sur ce caractère:

On Tue, Jul 14, 2009 at 09:58:28PM +0200, Yannick Fouquet wrote:
> % cat blabla.html |
> perl -W -e 'while (<>){print "$2n" if (/<a(.*?)>(.*)</a/oi);};'

^

Il fait quoi ce 'o'? Je ne le trouve pas dans perlre(1).

Merci d'avance,
Y.



Le manuel Perl est impressionnant quant à la qualité des documents en
français. Ce n'est pas un programme sinon un langage ( langage pratique
d'extraction et de rapport - Practical Extraction and Report Language ) ce
qui demande de regarder les documents et exemples.

Pour comprendre le code ci-dessus, il faut regarder les documents:

- perlre Expressions régulières
- perlvar Variables prédéfinies en Perl
- perlfaq Foire Aux Questions
- perlrun Invocation de Perl et ses arguments
- perldata Types de données de Perl

Il y a aussi le programme 'perldoc' pour une documentation sur une fonction .
Par exemple pour comprendre comment ouvrir un fichier uniquement en lecture:

% perldoc -f open

Saches que le code dans un script serait différent car il manque des él éments:

#!/usr/bin/perl -w

use strict;

unless ( defined(@ARGV) ) {
print "Usage: $0 doc1.html doc2.html ...n";
exit(1);
}

while ( my $f = shift(@ARGV) ) {
open(FH,"<" . $f) or die("open($f): $!n");
print $f . ":n";
while ( <FH> ) {
chomp();
if ( /<a(.*?)>(.*)</a/oi ) {
print $1 . "n";
}
}
close(FH);
}
exit(0);

Enfin, pour améliorer le code d'une ligne, en utilisant l'option '-n' (bo ucle
implicite autour de l'intégralité du code - plus besoin de while(<>){.. .}):

% perl -ne 'print "$1n" if /<a(.*?)>(.*)</a/oi' html.html

Avec l'option '-i' ( édition sur place ) voila un 'sed' dopé à l'EPO en
gardant une sauvegarde tout en modifiant le fichier 'monfichier' :
<http://articles.mongueurs.net/magazines/linuxmag50.html>

% perl -i.backup -pe 's/bfoob/toto/g;s/bbarb/titi/g' monfichier
% ls
monfichier
monfichier.backup

Je ne suis absolument pas un expert, mais Perl est riche, puissant et soupl e
pour ce que tu veux faire.

Personnellement, j'ai appris en lissant et relisant la documentation Perl,
alors j'insiste pour que tu t'y plonge aussi...


Sites:

Introduction au langage Perl ( c'est quoi 'for', c'est quoi 'while', ...:
<http://www.med.univ-rennes1.fr/~poulique/cours/perl/perl_html/introperl42. html>

Les Mongueurs de Perl:
<http://paris.mongueurs.net/>
<http://articles.mongueurs.net/magazines/>

Salut;
--
(o_
(/)_
S e r g e

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists Vous pouvez aussi ajouter le mot
``spam'' dans vos champs "From" et "Reply-To:"

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Avatar
Jerome Moinet
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

fabrice régnier a écrit :
salut la liste ;)

je cherche à parser la balise <A variables_de_la balise >blabla</A> et à
récupérer le contenu blabla.
Grep ne fait pas ce que je veux car il me donne toute la ligne où
apparait <A>.

J'ai bien testé avec awk quelque chose du genre:
cat mon_fichier_html | awk awk -F"<A" '{print $1}' mais je ne sais pas
comment lui indiquer la fin de la balise </A>

Des idées ?



echo "<A variables_de_la balise >blabla</A>" | sed s/"<[^>]*>"/""/g

Si il y a des espaces ou des tabulations devant :

echo " <A variables_de_la balise >blabla</A>" | sed s/"<[^>]*>"/""/g
| sed s/"^[ ]*"/""/
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iEYEARECAAYFAkpeujoACgkQ3ygQTLujCrR6JwCfdDoq0wc1uLKj8RikBEHeomag
keoAnR9M++kqdmtf+5nvJUtzaRgY+aKO
=yWvt
-----END PGP SIGNATURE-----

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists Vous pouvez aussi ajouter le mot
``spam'' dans vos champs "From" et "Reply-To:"

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Avatar
Basile STARYNKEVITCH
Jerome Moinet wrote:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

fabrice régnier a écrit :

salut la liste ;)

je cherche à parser la balise <A variables_de_la balise >blabla</A> et à
récupérer le contenu blabla.
Grep ne fait pas ce que je veux car il me donne toute la ligne où
apparait <A>.




C'est typiquement un boulot pour XSLT http://en.wikipedia.org/wiki/Xslt
paquet xsltproc et commande de même nom.


--
Basile STARYNKEVITCH http://starynkevitch.net/Basile/
email: basile<at>starynkevitch<dot>net mobile: +33 6 8501 2359
8, rue de la Faiencerie, 92340 Bourg La Reine, France
*** opinions {are only mines, sont seulement les miennes} ***

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists Vous pouvez aussi ajouter le mot
``spam'' dans vos champs "From" et "Reply-To:"

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Avatar
Yannick Fouquet
Bonjour,
Jerome Moinet a écrit :
fabrice régnier a écrit :
je cherche à parser la balise <A variables_de_la balise >blabla</A> et à
récupérer le contenu blabla.



echo "<A variables_de_la balise >blabla</A>" | sed s/"<[^>]*>"/""/g

Si il y a des espaces ou des tabulations devant :

echo " <A variables_de_la balise >blabla</A>" | sed s/"<[^>]*>"/""/g
| sed s/"^[ ]*"/""/



AMHA, cette solution marche très bien pour du nettoyage de code (i.e.
enlever toutes les balises).
Le problème ici c'est qu'on peut avoir autre chose que la balise A sur
la ligne, par exemple b :
echo " <b>truc</b> <A variables_de_la balise >blabla</A>" | sed
s/"<[^>]*>"/""/g| sed s/"^[ ]*"/""/
truc blabla

or fabrice régnier semble ne vouloir que blabla.
La solution perl marche bien :

% cat blabla.html |
perl -W -e 'while (<>){print "$2n" if (/<a(.*?)>(.*)</a/oi);};'


on doit pouvoir faire la même chose à base de sed et de remplacements,
mais si l'on tient compte qu'il peut y avoir d'autres balises, d'autres
A avant ou après et plusieurs balises <A, ça ne me parait pas évident.

echo " machin <b>truc</b> Ah ah ah ! <A variables_de_la balise
>blabla</A> <A variables2>bidule</A> chouette" | sed -r
s/"^.*<A[^>]*>([^<]*)</A>.*$"/"1"/g
bidule

Ne donne que le contenu de la dernière balise A.

On doit pouvoir faire mieux en combinant avec grep par exemple :

echo " machin <b>truc</b> Ah ah ah ! <A variables_de_la balise
>blabla</A> <A variables2>bidule</A> chouette" | grep -o -E
"<A[^>]*>([^<]*)</A>" |sed -r s/"^.*<A[^>]*>([^<]*)</A>.*$"/"1"/
blabla
bidule


@+
Yannick.

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists Vous pouvez aussi ajouter le mot
``spam'' dans vos champs "From" et "Reply-To:"

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Avatar
fabrice régnier
Vraiment merci à tous pour les conseils.

Cette liste m'épate de jours en jours ;)

Je suis très très mal à l'aise avec perl et j'ai résolu mon problème
avec un script ... php *honte* :-p

Sinon, j'ai regardé xsltproc, c'est ce que j'utiliserai lorsque le
besoin ne sera plus ponctuel.

merki et a+

f.

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists Vous pouvez aussi ajouter le mot
``spam'' dans vos champs "From" et "Reply-To:"

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS