#1 Le 21/09/2008, à 10:36
- altgr
Remplacer une balise par une autre dans un fichier html
Bonjour
Soit le code suivant :
<span class="italique">
bonjour <span class="gras">madame</span>
</span>
Je voudrais remplacer les balises <span> qui ont un attribut "class" de valeur "italique" par des balises <i> et remplacer les <span> qui ont une classe "gras" par des balises <b> (ou <em> et <strong>, peu importe, c'est un exemple)
Donc au final obtenir :
<i>
bonjour <b>madame</b>
</i>
Avant j'utilisais Dreamweaver qui rend les choses très simples : dans le panneau rechercher/remplacer, il suffit de sélectionner une balise (span) avec un attribut (class) et d'indiquer la valeur ("italique"), puis en dessous on sélectionne par quelle balise on veut remplacer.
Est-ce qu'il existe un outil/logiciel capable de faire cela sous Linux ?
Comme je n'en ai pas trouvé, je me suis dit que c'est sans aucun doute possible de faire cela via un script, par exemple python ou perl, puisqu'il existe des modules de type "parser html".
J'ai fait plusieurs essais, mais n'y connaissant rien ni à Python ni à Perl, j'ai perdu pas mal de temps pour rien.
Quelqu'un pourrait me donner un script qui peut modifier mon exemple comme je le souhaite ?
Peu importe le langage du moment que ça fonctionne.
merci d'avance
#2 Le 21/09/2008, à 10:46
- Kanor
Re : Remplacer une balise par une autre dans un fichier html
Pourquoi tu n'utilise pas la fonction que tu peux trouver dans tous les éditeur ,remplacer par
par exemple dans gedt c'est ctrl+h
Hors ligne
#3 Le 21/09/2008, à 11:14
- altgr
Re : Remplacer une balise par une autre dans un fichier html
Ça serait à la limite possible s'il suffisait que <span class="italique"> soit remplacé par <i> (ou <b> pour "gras"), mais il faut également que la bonne balise fermante </span> correspondante soit remplacée par </i> ou (</b> pour "gras").
Et là ce n'est pas possible avec un simple rechercher/remplacer.
#4 Le 21/09/2008, à 11:26
- Dark-Sham
Re : Remplacer une balise par une autre dans un fichier html
Tu peux faire ça avec un sed,un script Perl ou autre chose qui utilise des Regex.
Par exemple :
#!/usr/bin/perl
use strict ; use warnings ;
my $test = "<span class=\"italique\">Bonjour <span class=\"gras\">madame</span></span>";
$test =~ s/<span class="italique">(.+)<\/span>/<i>$1<\/i>/gsi;
$test =~ s/<span class="gras">(.+)<\/span>/<b>$1<\/b>/gsi;
print "$test\n";
Copie/colle tout ça dans un fichier, rends-le éxecutable et éxecute-le, ça devrait fonctionner.
EDIT :
$ ./test.pl
<i>Bonjour <b>madame</b></i>
Tu vois Il te suffit maintenant d'adapter le code à ton besoin
Dernière modification par Dark-Sham (Le 21/09/2008, à 11:28)
Script de sauvegarde/restauration APT
Ubuntu 8.04 "Hardy Heron"
CPU : AMD Athlon XP 2800+ ; GPU : ATI Radeon 9250/9200 Series ; RAM : 2 Gigots + 512 Mégots ; Carte mère : Asus A7N8X-E Deluxe
Hors ligne
#5 Le 21/09/2008, à 12:17
- altgr
Re : Remplacer une balise par une autre dans un fichier html
Merci Dark-Sham, mais je pense qu'il est impossible d'y aller juste à coup de rechercher/remplacer. Si je modifie un peu la chaîne de caractère en ajoutant un élément span à la fin, rien ne va plus :
my $test = "<span class=\"italique\">Bonjour <span class=\"gras\">madame</span></span> et <span class=\"gras\">monsieur</span>";
cela va donner : <i>Bonjour <b>madame</span></b> et <span class="gras">monsieur</i>
au lieu du résultat souhaité : <i>Bonjour <b>madame</b></i> et <b>monsieur</b>
Avec uniquement des rechercher/remplacer on ne peut pas déterminer à quelle balise ouvrante correspond une balise fermante.
C'est pourquoi je pense qu'il faudrait passer par un module "parsant" le code html. Mais le peu que j'ai trouvé en python/perl dépasse de loin mes compétences.
#6 Le 21/09/2008, à 12:29
- Dark-Sham
Re : Remplacer une balise par une autre dans un fichier html
Exact, c'est étrange... Ben ben je ne vois rien d'autre qui pourrait t'aider
Bonne chance
Script de sauvegarde/restauration APT
Ubuntu 8.04 "Hardy Heron"
CPU : AMD Athlon XP 2800+ ; GPU : ATI Radeon 9250/9200 Series ; RAM : 2 Gigots + 512 Mégots ; Carte mère : Asus A7N8X-E Deluxe
Hors ligne
#7 Le 21/09/2008, à 13:39
- best_friend_fr
Re : Remplacer une balise par une autre dans un fichier html
Salut,
Tu peux faire un script awk avec un compteur qui te dit combiende span sont ouverts a tout moment.
sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr
Hors ligne
#8 Le 21/09/2008, à 15:45
- altgr
Re : Remplacer une balise par une autre dans un fichier html
J'avais pensé à bricoler un script de cette façon, mais j'aimerais quelque chose de plus adapté
J'ai regardé du côté de Beautifulsoup (python). Ça permet de faire pas mal de choses de ce genre :
http://www.crummy.com/software/BeautifulSoup/documentation.html
Malheureusement je n'arrive à savoir comment m'y prendre concernant mon exemple.
Quelqu'un connaît un peu et pourrait m'aider ?
#9 Le 21/09/2008, à 19:22
- altgr
Re : Remplacer une balise par une autre dans un fichier html
Bon alors je suis arrivé à quelques résultats avec BeautifulSoup, mais je ne maîtrise pas assez pour faire quelque chose de satisfaisant.
Puis je sous tombé sur un script PHP, il est vraiment impressionnant de simplicité et d'efficacité : PHP Simple HTML DOM Parser
http://simplehtmldom.sourceforge.net
Par exemple pour changer tous les span "italique" en balise i et supprimer l'attribut class, il suffit de faire :
$html=str_get_html($html);
foreach($html->find("span[class=italique]") as $e) {
$e->tag=i;
$e->class=null;
}
Je n'avais pas pensé aux scripts PHP car dans mon esprit "php c'est pour le web", or on peut très bien se faire des scripts PHP pour un autre usage (tout comme on peut faire des script bash ou python pour le web d'ailleurs)
Voilà un script complet par rapport à mon exemple de départ :
#!/usr/bin/php
<?php
include('simple_html_dom.php');
function change_tag($html, $css, $tag) {
foreach($html->find("span[class=$css]") as $e) {
$e->tag=$tag;
$e->class=null;
}
return $html;
}
$html = str_get_html('<span class="italique">
bonjour <span class="gras">madame</span>
</span> et <span class="gras">monsieur</span>');
change_tag($html, "italique", "i");
change_tag($html, "gras", "b");
print $html;
?>
Par contre je suis toujours très intéressé par des script python (notamment avec BeautifulSoup) ou perl faisant la même chose. Donc n'hésitez pas à donner des solutions