[SED/XHTML] Supression d'un NOSCRIPT imbriqué dans un SPAN

Supression d'un NOSCRIPT imbriqué dans un SPAN [SED/XHTML] - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 18-05-2008 à 12:15:44    

Bonjour à tous.  :hello:

 

Je traite actuellement des (vieux) fichiers HTML "non conformes" aux standards. Je les nettoie avec tidy pour qu'il respecte la dtd transitional de XHTML. Seulement tidy ne nettoie pas tout, en particulier il laisse des balises NOSCRIPT imbriquées dans des SPAN, du coup les fichiers XHTML produits ne sont pas valides.

 

Je souhaite donc faire un prétraitement afin de supprimer ces balises NOSCRIPT, à savoir simplement supprimer ces balises et ce qu'elles contiennent, avant de fournir les fichiers à tidy. Pour l'instant, j'ai une solution provisoire qui ne me satisfait pas, avec sed :

 

s/<NOSCRIPT.*\/NOSCRIPT>//g

 

La directive précédente permet de virer toutes les balises NOSCRIPT et ce qu'elles contiennent du fichier (je ne sais pas si ça marche sur plusieurs lignes ou si c'est réduit à une seule ligne), même celles qui sont valides, c'est-à-dire pas forcément dans la portée d'un SPAN.

 

En résumé, de ça :

 

un peu de texte <SPAN> différentes
balises dont <NOSCRIPT> du
blabla </NOSCRIPT> encore un peu
de choses ici </SPAN> et là ou là <NOSCRIPT> ça on peut
garder </NOSCRIPT> c'est pas
imbriqué

 

je veux obtenir ça :

 

un peu de texte <SPAN> différentes
balises dont
 encore un peu
de choses ici </SPAN> et là ou là <NOSCRIPT> ça on peut
garder </NOSCRIPT> c'est pas
imbriqué

 

Je ne sais pas si c'est faisable avec sed (je lis partout que c'est puissant, l'occasion de le prouver :o), mais ça m'arrangerait vu que j'intègre ce prétraitement avec d'autre commandes sed dans un fichier de directives.

 

Merci de votre aide.

 

Bon dimanche. :)


Message édité par Jeddo le 18-05-2008 à 12:18:08

---------------
FREE DATOUNE
Reply

Marsh Posté le 18-05-2008 à 12:15:44   

Reply

Marsh Posté le 19-05-2008 à 19:49:28    

Bonsoir,
 
Je n'ai pas décortiqué la réponse, mais je crois que la réponse est ici :
http://linuxfr.org/forums/26/7199.html
 
vw.

Reply

Marsh Posté le 19-05-2008 à 20:31:23    

Merci de ta réponse.
 

$ cat sed.test
un peu de texte <SPAN> différentes
balises dont <NOSCRIPT> du
blabla </NOSCRIPT> encore un peu
de choses ici </SPAN> et là ou là <NOSCRIPT> ça on peut
garder </NOSCRIPT> c'est pas
imbriqué
$ cat sed.test | sed -e '/\<<NOSCRIPT>\>/,/\<<\/NOSCRIPT>/p'
un peu de texte <SPAN> différentes
balises dont <NOSCRIPT> du
blabla </NOSCRIPT> encore un peu
de choses ici </SPAN> et là ou là <NOSCRIPT> ça on peut
garder </NOSCRIPT> c'est pas
imbriqué


 
Ça n'a pas l'air de fonctionner.
Je ne vois pas non plus comment sélectionne les <NOSCRIPT> seulement s'ils sont imbriqués dans un <SPAN>.


---------------
FREE DATOUNE
Reply

Marsh Posté le 19-05-2008 à 20:49:42    

Hello,
 
sans avoir testé je suis pas sur que sed fasse l'affaire, il serai peut être mieux de passer par un script (perl par ex.) afin de récuperer, via regexp, les balises span puis noscript.

Reply

Marsh Posté le 19-05-2008 à 20:54:51    

Tu trouveras de bons indices ici : Pattern matching across several lines  
http://www.cs.utk.edu/~vose/c-stuff/sed_tutorial.html
 
Mais c'est sur que ce serait sans doute plus propre en perl comme le dit sub1.
 
vw

Reply

Marsh Posté le 19-05-2008 à 22:07:56    

moi voila ce que je ferai  
-> j'enleverai les newlines en carractère par exemple XXX ,  
-> je fais mes changements  
-> puis reremplace XXX par un newline.
 
J'utilise plus particulièrement vim et pour le 1°  je tape ceci :%s/\n/ XXX /

Reply

Marsh Posté le 19-05-2008 à 22:52:47    

je connais pas sed, mais voici un début de solution en perl :

~/tmp> cat jeddo.pl
#! /usr/bin/perl
 
use strict;
 
my $content = join "", <>;
$content =~ s|(<SPAN>.*)<NOSCRIPT>.*</NOSCRIPT>(.*</SPAN> )|$1$2|gs;
print $content;

~/tmp> cat essai.txt
un peu de texte <SPAN> différentes
balises dont <NOSCRIPT> du
blabla </NOSCRIPT> encore un peu
de choses ici </SPAN> et là ou là <NOSCRIPT> ça on peut
garder </NOSCRIPT> c'est pas
imbriqué

~/tmp> ./jeddo.pl essai.txt
un peu de texte <SPAN> différentes
balises dont  encore un peu
de choses ici </SPAN> et là ou là <NOSCRIPT> ça on peut
garder </NOSCRIPT> c'est pas
imbriqué


 
N'hésite pas à demander si tu veux des explications sur la regexp ou le reste du script.
 
Il y a plein de choses à améliorer, mais c'est sans doute un début... En particulier, il y a peut-être dans la regexp des motifs trop gloutons qui peuvent poser problème.


---------------
TriScale innov
Reply

Marsh Posté le 19-05-2008 à 23:09:26    

Pour les cas pathologiques (genre deux NOSCRIPT imbriqués dans le même SPAN), je  vois pas comment faire plus joliement qu'en réappliquant plusieurs fois la regexp.
 

~/tmp> cat jeddo.pl
#! /usr/bin/perl
 
use strict;
 
my $content = join "", <>;
while ($content =~ s|(<SPAN>.*)<NOSCRIPT>.*?</NOSCRIPT>(.*</SPAN> )|$1$2|gs) {1;}
print $content;

~/tmp> cat essai.txt
<SPAN>toto</SPAN> un peu de texte <SPAN> différentes
balises dont <NOSCRIPT> du
blabla </NOSCRIPT> encore un peu
de choses ici <NOSCRIPT>un deuxieme noscript</NOSCRIPT> </SPAN> et là ou là <NOSCRIPT> ça on peut
garder </NOSCRIPT> c'est pas
imbriqué

~/tmp> ./jeddo.pl essai.txt
<SPAN>toto</SPAN> un peu de texte <SPAN> différentes
balises dont  encore un peu
de choses ici  </SPAN> et là ou là <NOSCRIPT> ça on peut
garder </NOSCRIPT> c'est pas
imbriqué


---------------
TriScale innov
Reply

Marsh Posté le 24-05-2008 à 12:04:36    

Merci pour vos propositions, je vais regarder ça de plus près :)


---------------
FREE DATOUNE
Reply

Marsh Posté le 24-05-2008 à 12:06:57    

c'est un peu HS, mais t'es tu penché sur l'extension python BeautifulSoup qui permet de faire plein de truc avec du html et notamment de retirer des éléments particuliers ?
http://www.crummy.com/software/Bea [...] 20elements


---------------
Celui qui pose une question est idiot 5 minutes. Celui qui n'en pose pas le reste toute sa vie. |  Membre du grand complot pharmaceutico-médico-scientifico-judéo-maçonnique.
Reply

Marsh Posté le 24-05-2008 à 12:06:57   

Reply

Marsh Posté le 24-05-2008 à 12:57:49    

Finalement j'ai retenu le script de francesco et intégré à mon script global :jap:
 
Pour sed, la question reste ouverte.


---------------
FREE DATOUNE
Reply

Marsh Posté le 24-05-2008 à 13:02:01    

Mjules a écrit :

c'est un peu HS, mais t'es tu penché sur l'extension python BeautifulSoup qui permet de faire plein de truc avec du html et notamment de retirer des éléments particuliers ?
http://www.crummy.com/software/Bea [...] 20elements


 
C'est vrai qu'on a aussi une partie de python dans notre traitement, mais ce n'est du tout pas moi qui m'en occupe :D.
Cela dit, je vais mettre ce lien de côté, ça pourrait servir vu qu'on aura pas mal de prétraitement à faire sur XML/XHTML.


---------------
FREE DATOUNE
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed