Affichage des articles dont le libellé est (en/dé)codage. Afficher tous les articles
Affichage des articles dont le libellé est (en/dé)codage. Afficher tous les articles

mardi 29 novembre 2011

Séance #6 - application

Un aspect important n'avait jusqu'ici pas été pris en compte dans nos scripts: l'encodage de la page html. Dans ce projet, nous sommes amenées à travailler sur plusieurs langues comportant des caractères non-ascii et il est donc capital de pouvoir toutes les traiter sans avoir à spécifier une table de caractères différente à chaque fois. Cette possibilité nous est donnée par utf-8.
Convertir un fichier en utf-8 n'est pas compliqué en soi, mais cette étape en implique bien d'autres puisqu'il faut d'abord savoir de quel encodage on part avant d'appliquer le processus de conversion!

 Avant même d'écrire du code, commençons par structurer nos idées. Voici ma démarche détaillée en bon (?) français:
Si l'encodage repéré par file est bien utf-8,
... alors on dumpe directement - lynx
... sinon, on cherche à savoir si l'encodage repéré est connu d'iconv
      Si l'encodage est connu d'iconv
      ... alors convertir puis dumper - iconv, lynx
      ... sinon, s'aider des métadonnées html
         Si l'argument charset de la balise meta est bien présente,
         ... alors extraire la valeur de l'argument charset
            Si l'encodage extrait est connu d'iconv,
            ... alors convertir puis dumper - iconv, lynx
            ... sinon, échec: encodage extrait inconnu d'iconv.
         ... sinon, échec: encodage non précisé dans le code html.

Ce qui donne en script:


 Pour réaliser toutes les étapes décrites ci-dessus, nous nous sommes servies des commandes file, iconv, egrep et lynx que nous détaillons ci-dessous:
  •  encodage=`file -b --mime-encoding ./PAGES-ASPIREES/$i/$j.html`; (qui précède toutes les étapes et n'apparaît pas dans les screenshots)
Cette commande permet de stocker dans la variable encodage le résultat de la commande file qui, elle, nous donne l'encodage de la page mise en input.
-b (brief) est une option qui rend un output bref, c'est-à-dire sans le nom du fichier. (./PAGES-ASPIREES/1/1.html: text/html; charset=utf-8)
--mime-encoding est une option qui nous donne l'encodage de page sans le type de contenu et sans le nom des arguments. (text/html; charset=utf-8).
[... et voilà comment se débarrasser des cuts.]
  • verif_iconv=`iconv -l | egrep -io $encodage`;
La première partie de cette commande nous fournit la liste des encodages connus par la commande de conversion iconv grâce à l'option -l (list). L'output de cette partie est redirigé vers l'input de la seconde partie qui va l'utiliser en contexte. En effet, la commande egrep s'utilise avec la syntaxe suivante: egrep [options] "motif" "contexte/domaine de recherche". Ici, le motif est l'encodage repéré au préalable par file, et les options utilisées, -i (ignore-case) et -o (only-matching) permet de ne pas prendre en compte la casse (ne sait-on jamais...) et de ne récupérer que ce les caractères qui correspondent à ce que l'on cherche.
  • lynx -dump -nolist -display_charset=$encodage ./PAGES-ASPIREES/$i/$j.html > ./DUMP-TEXT/$i/$j.txt;
La commande lynx a déjà été expliquée dans l'article précédent. Nous y avons juste ajouté l'option -display_charset qui indique à lynx dans quel encodage il faut écrire l'output de la commande.
  • iconv -f $encodage -t utf-8 "./PAGES-ASPIREES/$i/$j.html" > "./DUMP-TEXT/$i/$j-utf8.txt";
Si l'encodage repéré par file ou dans les métadonnées html est connu de la commande iconv, on peut appliquer cette ligne de commande qui va convertir le fichier à partir d'un encodage donné (-f (from code)) à un autre (-t (to code)).
  • egrep -qi ".*charset ?=.*" ./PAGES-ASPIREES/$i/$j.html
L'option -q (quiet) permet de ne rien écrire dans le terminal et de ne rien garder en output si le motif n'est pas trouvé dans le contexte. Le motif se décompose de cette manière: "trouver la chaîne de caractères charset, précédée de n'importe quoi (.* n'importe quel caractère à l'infini) et suivie ou non d'un espace ( ?) puis d'un = lui-même suivi de n'importe quel caractère".
  • charset_line=$(egrep -m 1 "charset=.*\"" ./PAGES-ASPIREES/1/31.html);
L'option -m (max count) suivi d'un chiffre permet de spécifier le nombre de correspondance que l'on veut, arrêtant le programme dès que ce nombre est atteint.
  • charset=$(expr "$charset_line" : '.*=\(.*\)\"');

La commande expr permet d'évaluer les expressions, et ici d'utiliser les parenthèses qui extraient directement le motif qui sont incluses dedans. Cette expression régulière illisible et qui nous a donné du fil à retordre se lit donc: "extraire tous les caractères quels qu'ils soient (.*) entre les parenthèses échappées par \ qui sont précédées d'un = lui-même précédé de n'importe quel caractère (.*), et suivies d'un " (échappé aussi par \). [on se comprend, n'est-ce pas?]

Ce qui donne le résultat suivant:


mercredi 9 novembre 2011

Séance #3 - applications

Parées de toutes les commandes que nous avions apprises jusqu'ici, nous voici en direction de notre premier exercice du projet: la création d'un tableau regroupant les URLs récupérées.

Cet exercice consiste à améliorer le script d'origine étudié en cours et se compose de plusieurs étapes:
A] Insérer une nouvelle colonne pour constituer une colonne de numérotation des URLs.
B] Établir un lien vers les pages de chacune de nos URLs.
C] Modifier le script pour traiter plusieurs fichiers d'URLs et pour construire en sortie plusieurs tableaux dans le même fichier.
 A] Numérotation des URLs
Concrètement, numéroter les URLs, ça veut dire écrire "1" dans la première cellule de la première ligne, à côté de la première URL, puis écrire "2" dans la première cellule de la deuxième ligne, à côté de la deuxième URL etc. Bref, un exercice manuel beaucoup trop fastidieux mais, heureusement pour nous, facilement automatisé en trois étapes:
  1. Créer une variable qui contiendra les chiffres servant à la numérotation: i=1;
  2. Créer une cellule à chaque ligne: <tr><td>$i</td><td>$nom</td></tr>
  3. Incrémenter la variable dans la boucle déjà établie: i=`expr $i + 1`; (dans la boucle for)
Si les deux premières étapes découlent naturellement du cours, ce n'est pas le cas pour la troisième, qui, elle, a nécessité quelques recherches sur internet. En effet, après avoir essayé diverses méthodes connues (incrémentation par i++ ou encore i=i+1 ou i=$i+1) dont aucune ne fonctionnait, nous nous sommes résignées à nous documenter. La commande expr que nous avons trouvée sert en réalité à évaluer des expressions, ici arithmétique puisque l'incrémentation est une addition avec pour deuxième argument 1. La valeur de l'évaluation est alors retournée et assignée à la variable i grâce aux antiquotes ``.


B] Liens hypertexte
Pour cet étape, il s'agit de ne pas afficher uniquement les urls, mais d'en faire des liens hypertextes cliquables qui vont directement aux pages indiquées par les urls. On utilise pour cela la balise HTML <a href "url.html">url.html</a>.


C] Modification du script pour traiter plusieurs fichiers d'URLS
La solution que nous avons adoptée est la suivante:
  1. Créer une deuxième variable qui va contenir le lien vers le deuxième fichier
  2. Créer une deuxième boucle for pour générer automatiquement un deuxième tableau sur le modèle du premier.
Voici élaboré pour cet exercice, ainsi que son résultat.

Problème: si cette méthode fonctionne pour deux fichiers d'URLs, elle ne permet cependant pas de traiter moins de deux fichiers, ou plus. Voici donc le script retravaillé après avoir vu la correction mise en ligne, suivi de la page html générée par ce script: 
 
Avec l'assignation du chemin vers le répertoire contenant les URLs à la variable et avec la création d'une boucle générant un tableau entier, dans laquelle on a laissé celle qui génère chaque ligne des tableaux, il est maintenant possible de traiter autant de fichiers qu'il est nécessaire.

/!\ Le codage de la page html a été ajusté manuellement, le ° étant un caractère posant le même problème que les accents dans un des articles précédents.

EDIT: problème d'encodage et de décodage réglé! Il faut juste vérifier systématiquement que l'on a bien à la fois un script écrit en utf-8 (soit en vérifiant avec "Enregistrer sous", soit en convertissant le fichier avec la commande iconv) ET la balise <meta /> correctement copiée tapée qui précise au navigateur qu'il est judicieux de lire la page en utf-8. La première condition est inutile sans la seconde, et vice-versa...!