Quatre commandes shell essentielles nous permettent de réaliser les
traitements de données nécessaires à la construction de notre tableau.
Il s'agit de wget, lynx, egrep et sed.
Mais comment fonctionnent-elles?
On utilise cette commande pour télécharger les pages correspondantes à une ou plusieurs URLs et les enregistrer sur la machine locale.
Cette opération pourrait bien sûr se faire sous Windows avec la fonction Enregistrer sous... dans le menu Fichier de notre navigateur préféré. Par contre elle ne pourrait pas être automatisée pour une liste d'URLs. C'est pourquoi, vu le grand nombre de pages à aspirer, on a recours à wget.
Les options de wget en font un outil très puissant.
Par exemple :
D'autres options de base de wget servent à gérer la récursivité du téléchargement :
Notre objectif étant de récupérer uniquement les pages contenant le mot barrage, nous nous limiterons ici à un téléchargement "de surface".
Comme nous travaillons sur des listes d'URLs assez longues, il vaudrait mieux prévoir la durée maximale de téléchargement d'une page, pour éviter qu'un problème de connexion n'empêche la bonne exécution du programme. En effet il existe dans wget une série d'options liées à la durée de téléchargement. Entre autres:
Et pour finir, avec les options --user=nomUtilisateur et --password=motDePasse il nous est possible de télécharger des pages protégées (comme celles du corpus Le Monde, par exemple) en spécifiant le nom d'utilisateur et le mot de passe nécessaires à y accéder.
Syntaxe:
wget -N --user=$user --password=$pass --dns-timeout=60 --connect-timeout=60 -O ./nomPageAspiree.html url
Emploi dans le script fait-tableau.sh:
wget -N --dns-timeout=60 --connect-timeout=60 -O ../PAGES-ASPIREES/$fic-$i.html $nom
Pour en savoir plus sur la commande wget cliquer ici.
A première vue, ce navigateur hypertexte, qui fonctionne uniquement en mode texte et exclut donc l'emploi de la souris, n'apporte rien de plus par rapport à un navigateur classique. L'affichage de la page peut paraître désagréable et la navigation difficile. L'intérêt de lynx se trouve au contraire dans sa capacité à "mettre à plat" la structure d'un site, ce qui permet de manipuler facilement son contenu.
Dans notre cas notamment, nous nous en servirons pour créer une version texte simple de nos pages aspirées, en utilisant l'option -dump suivie d'une rédirection de flot de sortie pointant vers un fichier de texte.
Syntaxe:
lynx -dump ./nomPageAspiree.html > ./nomPageDumpee.txt
Emploi dans le script:
lynx -dump $nom > ../DUMP-TEXT/$fic-$i.txt
Pour en savoir plus sur lynx cliquer ici.
Cette commande signifie littéralement: « rechercher globalement (Global) les correspondances avec l'expression régulière (Regular Expression), et imprimer (Print) les lignes dans lesquelles elle correspond ». Elle sert donc à filtrer un texte, c.-à-d. à sélectionner les lignes d’un texte où une chaîne de caractères donnée entre guillemets (dite motif) apparaît.
Nous allons donc exécuter un filtrage sur chaque page dumpée pour en extraire les contextes du mot barrage. Les données sortantes peuvent soit être stockées dans un fichier de texte, soit affectées à une variable qui nous permettra d'afficher le contexte dans une colonne du tableau (voir suite).
Syntaxe:
egrep "motif" ./nomFichier.txt
Emploi dans le script:
egrep -i -A 2 -B 2 "barrage" ./DUMP-TEXT/$i.txt
Options:
-i : indépendamment de la casse
-A n (after) –B n (before): conserve n lignes après et avant la ligne contenant le motif.
Pour en savoir plus sur la commande egrep cliquer ici.
La commande sed avec option -s sert à remplacer une chaîne de caractères donnée (ou plus en géneral une expression régulière) par une autre chaîne de caractères. L'option -g spécifie que le remplacement doit être effectué pour toutes les occurrences de la chaîne.
Syntaxe:
sed 's/chaine1/chaine2/g'
Cette dernière commande n'est pas à priori nécessaire à la création de notre tableau. Nous l'avons quand-même employée deux fois pour améliorer le script.
1) Dans la phase de lecture du répertoire contenant les listes d'URLs, sed nous permet d'éliminer les extensions des fichiers de texte. On obtient de cette façon une liste de mots clés renvoyant aux différents sens du mot barrage. Ces mots serviront à nommer les fichiers des pages aspirées et des pages dumpées correspondantes.
Emploi dans le script:
ls $rep | sed 's/\.txt//g' > ./dir.txt
2) Dans la phase de filtrage on emploie sed pour entourer chaque mot barrage par des balises html de mise en évidence, et aussi pour remplacer chaque fin de ligne par une balise de retour à la ligne, ce qui rend la colonne des contextes bien plus lisible.
Emploi dans le script:
sed 's/[bB][aA][rR][rR][aA][gG][eE]/\\barrage\<\/font\>\<\/strong\>/g'
sed 's/$/\<\br\/\>/g'
Pour en savoir plus sur la commande sed cliquer ici.
Le langage html prévoit une série de balises permettant la création des tableaux. Pour que notre programme produise un tableau, il faudra donc qu'il écrive dans un fichier les bonnes balises dans le bon ordre.
L'écriture de texte dans un fichier se réalise avec la commande echo, qui est en fait une simple commande d'affichage. Si par exemple on écrit en ligne de commande:
echo "bonjour"On lira à l'écran:
bonjour
Notre but étant d'écrire du texte dans un fichier, nous n'aurons
qu'à diriger les données en sortie non pas à l'écran mais vers le
fichier en question.
La redirection de flot sortant est réalisée par les symboles > et >> :
le premier écrase le contenu éventuel du fichier visé, alors que le
second concatène le nouveau texte à l'ancien.
Il faudra donc faire attention à utiliser les bons symboles: > pour la
première instruction d'écriture et >> pour les suivantes.
Les premières balises dont nous avons besoin sont:
echo "<html><head><title>Tableau de liens</title></head><body>
<table border=1>
<th>Liens vers la page WEB</th><th>Pages aspirées</th><th>Pages
dumpées</th><th>Contexte</th>" > ../JOURNAL/tablo-$fic.html;
#code de début de tableau et titre du tableau
Maintenant il faut ajouter des lignes et des colonnes. Le procédé est le suivant: on signale chaque ligne par <TR></TR> et à l'intérieur de celle-ci on écrit chaque cellule avec les balises <TD></TD>. L'attribut width=15% sert à déterminer la largeur de la cellule par rapport à celle du tableau entier.
Le tableau que nous voulons écrire doit contenir une ligne par url, il faut donc utiliser une itération. C'est à dire que pour chaque url prise dans la liste, on écrira une ligne contenant quatre cellules.
Les opérations dont nous avons parlé plus haut doivent aussi être exécutées pour chaque url, elles seront donc incluses dans l'itération, et plus précisement au début de celle-ci. Ensuite on passe à l'écriture de la ligne du tableau.
En résumant on aura :
Pour créer un lien, on emploie la balise : <a href="nomUrl"></a>.
Voici la commande qui produit une ligne du tableau:
echo "<tr><td width=15%><A href="$nom">page web $i</A></td> <td width=15%><a href="../PAGES-ASPIREES/$fic-$i.html">page aspirée $i</a></td> <td width=15%><a href="../DUMP-TEXT/$fic-$i.txt>page dumpée">page dumpée $i</a></td> <td width=55%><p>$contexte</p></td></tr>" >> ../JOURNAL/tablo-$fic.html;
Enfin il ne faudra pas oublier d'écrire le code de fin tableau et de fin de fichier, à l'extérieur de la boucle, biensûr:
echo "</table></body></html>" >> ../JOURNAL/$fic-tablo.html;
Le tableau est maintenant créé.
Après avoir réalisé le programme de création du tableau, nous nous démandons s'il ne serait pas intéressant d'automatiser cette même tâche afin que tous les tableaux de liens associés aux différents sens du mot barrage soient crées en même temps. L'objectif est que l'utilisateur n'ait qu'à fournir le nom du répertoire et qu'il reçoive en sortie soit plusieurs tableaux, soit une page globale les contenant tous.
Il faudra donc introduire dans le script une nouvelle phase de lecture et transformer l'itération simple en itération double.
Pour la lecture du répertoire on exécute un ls, on élimine les extensions des fichiers (avec sed) et on enregistre les données sortantes dans un fichier de texte (dir.txt).
# crée un fichier txt contenant la liste des
# fichiers-listes d'URLs (noms sans extension)
ls $rep | sed 's/\.txt//g' > ./dir.txt
On a ainsi obtenu une liste de noms de fichiers correspondants aux sens du mot exploré. Par le moyen de cette liste nous pouvons maintenant lire le contenu des fichiers, ainsi que donner des noms "intelligents" aux pages aspirées et aux pages dumpées qui seront créées.
Quant au traitement des données, il sera géré par deux boucles imbriquées. La première se repète pour chaque fichier contenu dans le répertoire...
for fic in `cat ../dir.txt`
...et la deuxième pour chaque url contenue dans chaque fichier :
for nom in `cat $fic.txt`
Dans cette deuxième boucle, on emploie aussi un compteur ($i) pour numéroter les fichiers créés dans les différents répertoires de l'arborescence.
Le même programme réalisé créé à la fois le tableau global et les tableaux séparés. Pour ce faire il faut bien faire attention où l'on place les codes de début et fin tableau : à l'extérieur de toute boucle pour le tableau global, à l'intérieur de la première pour les autres tableaux.