Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 03/10/2011, à 15:01

Regenesis

[RESOLU] [DEMANDE] modifier récursivement des fichiers html

Bonjour,

J'ai environ 400 pages html qui contiennent chacune la description d'un objet + entête et pied de page d'un site + menus sur les côtés.
Mon but est de réaliser un pdf avec uniquement la description des 400 objets.

J'ai donc besoin, pour chaque fichier html, de réaliser des opérations similaires (suppression entête et pied de page et menus).

J'ai cherché dans la doc ubuntu et je pense que c'est faisable en lignes de commande avec grep et cut, mais franchement ça commence à dépasser mes compétences. D'après ce que j'ai compris, ces commandes-là sont surtout utiles pour modifier une seule ligne, or dans mon cas il s'agit d'en supprimer plusieurs à la fois.

Quelqu'un pourrait-il me donner la commande-type afin que je puisse avance ?

Bien cordialement,

Dernière modification par Regenesis (Le 03/10/2011, à 21:54)

Hors ligne

#2 Le 03/10/2011, à 15:13

gl38

Re : [RESOLU] [DEMANDE] modifier récursivement des fichiers html

sed me semble tout à fait adapté à ce que tu veux faire.
Il existe sur internet plusieurs tutoriels et exemples.
Cordialement,
Guy

Hors ligne

#3 Le 03/10/2011, à 15:29

pingouinux

Re : [RESOLU] [DEMANDE] modifier récursivement des fichiers html

Bonjour,
Il faudrait  voir à quoi cela ressemble. Je pense que le mieux serait de poster une (petite) page de ce fichier en indiquant les modifs souhaitées.
Cordialement

Hors ligne

#4 Le 03/10/2011, à 16:03

Regenesis

Re : [RESOLU] [DEMANDE] modifier récursivement des fichiers html

Les données sont assez confidentielles, j'aimerais éviter dans un premier temps les copier ici.

J'ai réussi à isoler les lignes à modifier.

Mais lorsque j'essaie d'utiliser sed, se pose le problème des retours à ligne. Comment puis-je l'éviter ?

Merci !

Hors ligne

#5 Le 03/10/2011, à 16:12

pingouinux

Re : [RESOLU] [DEMANDE] modifier récursivement des fichiers html

Je comprends bien, mais il faudrait connaître la structure du fichier, pour savoir quelles balises rechercher. Est-ce possible d'envoyer une page de même structure, mais avec des données anodines ?
Modifié :
Plus simplement, quelles sont les balises d'en-tête, de pied-de-page, et de menu ?

Dernière modification par pingouinux (Le 03/10/2011, à 16:22)

Hors ligne

#6 Le 03/10/2011, à 16:26

Regenesis

Re : [RESOLU] [DEMANDE] modifier récursivement des fichiers html

Alors, d'après mes maigres compétences en html :
- balise d'en-tete : <head>
- balise de pied de page : <div id="footer">
- balise de menu : <div id="sidebar">

Hors ligne

#7 Le 03/10/2011, à 17:05

pingouinux

Re : [RESOLU] [DEMANDE] modifier récursivement des fichiers html

Bon, voici un petit script écrit en python :

#! /usr/bin/python
# -*- coding: utf-8 -*-

import sys, re

fic_html = sys.stdin.read()

rec_head = re.compile('<head>(.*?)</head>',re.S|re.M)
rec_foot = re.compile('<div id="footer">(.*?)</div>',re.S|re.M)
rec_side = re.compile('<div id="sidebar">(.*?)</div>',re.S|re.M)

fic_html = rec_head.sub('',fic_html)
fic_html = rec_foot.sub('',fic_html)
fic_html = rec_side.sub('',fic_html)

sys.stdout.write(fic_html)

Récupérer ce fichier, l'appeler par exemple strip_html.py, lui mettre les permissions

chmod u+x ./strip_html.py

Si les balises de fin sont comme je le crois, respectivement : </head>, </div>, et </div>, et qu'il n'y a pas de balises div imbriquées, cela devrait marcher

Utilisation

./strip_html.py <fichier_html_depart >fichier_html_final

Important : fichier_html_depart et fichier_html_final doivent être différents

Il se peut qu'il reste des lignes vides à la place de ce qui a été enlevé, il faudra voir alors.

Hors ligne

#8 Le 03/10/2011, à 17:23

Regenesis

Re : [RESOLU] [DEMANDE] modifier récursivement des fichiers html

Merci beaucoup, j'ai fait quelques modifications et cela fonctionne parfaitement !

2 questions néanmoins :
- comment exécuter ton script de manière récurrente ?
- comment modifier ton script de manière à pouvoir ajouter quelques lignes (je souhaite en effet "fusionner" le script.css) ?

Hors ligne

#9 Le 03/10/2011, à 17:37

pingouinux

Re : [RESOLU] [DEMANDE] modifier récursivement des fichiers html

Regenesis #8 a écrit :

- comment exécuter ton script de manière récurrente ?

Si tu entends par là l'appliquer à des fichiers différents :

for fichin in $(ls *.html)
do
   fichout=$fichin.modifie
   ./strip_html.py <$fichin >$fichout
done
Regenesis #8 a écrit :

- comment modifier ton script de manière à pouvoir ajouter quelques lignes (je souhaite en effet "fusionner" le script.css) ?

Je ne connais pas le script.css. Si tu peux préciser.

Hors ligne

#10 Le 03/10/2011, à 17:41

Regenesis

Re : [RESOLU] [DEMANDE] modifier récursivement des fichiers html

Pardon, style.css. Par exemple :  .style1 {    color: #FF00FF; font-size: 14px;    font: Times New Roman;}
Comment ajouter plusieurs lignes comme celle-ci à un endroit précis du fichier_html_final à l'aide de ton script ?

Hors ligne

#11 Le 03/10/2011, à 17:51

pingouinux

Re : [RESOLU] [DEMANDE] modifier récursivement des fichiers html

Il faut d'abord connaître une chaîne de caractères qui caractérise l'endroit précis (balises ou autre), ou un numéro de ligne.

Hors ligne

#12 Le 03/10/2011, à 17:54

Regenesis

Re : [RESOLU] [DEMANDE] modifier récursivement des fichiers html

Hé bien disons après

charset=UTF-8" />

Hors ligne

#13 Le 03/10/2011, à 18:12

pingouinux

Re : [RESOLU] [DEMANDE] modifier récursivement des fichiers html

Ce n'est pas très propre, mais voici un premier jet. La ligne est ajoutée après toutes les occurences de charset=UTF-8" />.
Séquence à ajouter dans strip_html.py

charset='charset=UTF-8" />'
ligne='.style1 {    color: #FF00FF; font-size: 14px;    font: Times New Roman;}'
rec_charset = re.compile(charset,re.S|re.M)
fic_html = rec_charset.sub(charset+'\n'+ligne,fic_html)

Dernière modification par pingouinux (Le 03/10/2011, à 18:13)

Hors ligne

#14 Le 03/10/2011, à 18:18

Regenesis

Re : [RESOLU] [DEMANDE] modifier récursivement des fichiers html

Merci, par contre il y a plusieurs lignes à ajouter.

Hors ligne

#15 Le 03/10/2011, à 19:08

pingouinux

Re : [RESOLU] [DEMANDE] modifier récursivement des fichiers html

Voici une façon de faire

charset = 'charset=UTF-8" />'
ligne = '''
.style1 {    color: #FF00FF; font-size: 14px;    font: Times New Roman;}
2ème ligne
3ème ligne'''

rec_charset = re.compile( charset, re.S|re.M )
fic_html = rec_charset.sub( charset + ligne, fic_html )

Noter les ''' ( 3 simples quotes consécutives ) qui encadrent la chaîne constituée de plusieurs lignes

Hors ligne

#16 Le 03/10/2011, à 19:32

Regenesis

Re : [RESOLU] [DEMANDE] modifier récursivement des fichiers html

Merci ! En fait, j'ai viré les retours à la ligne et ça marche ;-)
Mais je note ta technique...

J'ai donc désormais mes 400 fichiers html correctement "retaillés.
Maintenant, comment puis-je les fusionner en un seul fichier ?
En fait, il faudrait dans chaque fichier reprendre ce qui se situe entre les balises <body> (balises exclues) et les mettre à la suite dans le même fichier.

Dernière modification par Regenesis (Le 03/10/2011, à 19:35)

Hors ligne

#17 Le 03/10/2011, à 19:55

pingouinux

Re : [RESOLU] [DEMANDE] modifier récursivement des fichiers html

Il suffit de demander. D'abord, le script body_html.py pour traiter un seul fichier (je suppose qu'il n'y a qu'une seule paire <body> ... </body> dans ce fichier) :

#! /usr/bin/python
# -*- coding: utf-8 -*-

import sys, re

fic_html = sys.stdin.read()

rec_body = re.compile('<body>(.*?)</body>',re.S|re.M)

k=rec_body.search(fic_html)

if k : sys.stdout.write( k.group(1) )

Ensuite, la boucle sur tous les fichiers :

for fichin in *.html
do
   ./body_html.py <$fichin
done >fichier_complet_sans_body

Hors ligne

#18 Le 03/10/2011, à 21:54

Regenesis

Re : [RESOLU] [DEMANDE] modifier récursivement des fichiers html

Parfait, j'ai réussi à faire ce que je voulais.
Merci beaucoup pour ton aide, décidément le python c'est peu intuitif de prime abord !

Hors ligne

#19 Le 04/10/2011, à 07:18

pingouinux

Re : [RESOLU] [DEMANDE] modifier récursivement des fichiers html

Se mettre à python n'est pas si compliqué que ça, et c'est très puissant pour manipuler des fichiers. La maîtrise des expressions régulières est effectivement un peu difficile au début (mais pas plus que pour sed). Si tu veux des précisions sur certaines des commandes que j'ai utilisées, ce sera avec plaisir.

J'utilise aussi awk (et bien sûr sed), mais surtout pour des traitements ligne par ligne.

À la prochaine

Hors ligne

#20 Le 05/10/2011, à 21:25

Regenesis

Re : [RESOLU] [DEMANDE] modifier récursivement des fichiers html

J'ai réussi à réutiliser ton code pour créer des sauts de page à des endroits stratégiques lors de la conversion html>pdf, sans toi ça aurait été une sacrée galère. Dès que j'aurai un peu de temps, je vais m'intéresser à ce langage qui semble pouvoir rendre de bon services.

#! /usr/bin/python
# -*- coding: utf-8 -*-

import sys, re

fic_html = sys.stdin.read()

rec_1 = re.compile('</ul>\n    </div>(.*?)<div style="font-family: Arial;" class="single-blog">',re.S|re.M)

fic_html = rec_1.sub('''
      </ul>
    </div>
<div class="breakafter"></div>
    <div style="font-family: Arial;" class="single-blog">''',fic_html)

sys.stdout.write(fic_html)

Hors ligne

#21 Le 06/10/2011, à 06:09

pingouinux

Re : [RESOLU] [DEMANDE] modifier récursivement des fichiers html

Bonjour,
Il serait plus joli (et plus sûr), d'utiliser des variables pour les chaînes revenant plusieurs fois :

#! /usr/bin/python
# -*- coding: utf-8 -*-

import sys, re

fic_html = sys.stdin.read()

deb = '</ul>\n    </div>'
fin = '<div style="font-family: Arial;" class="single-blog">'
rec_1 = re.compile( deb+'(.*?)'+fin, re.S|re.M )

fic_html = rec_1.sub( '      \n'+deb+'\n<div class="breakafter"></div>\n    '+fin, fic_html )

sys.stdout.write(fic_html)

Bonne continuation

Hors ligne