Master 1 Plurital 2012
November 27 2012
Nous allons travailler uniquement dans un environnement Unicode. Il est donc nécessaire que tous les textes soient encodés en Unicode. Nous avons vu pour l’instant que ce n’est pas le cas, et qu’il faudrait convertir les pages qui ne sont pas en UTF-8 en UTF-8 afin de les traiter par la suite.
A partir des pages qui ont été aspirées (car ça ne sert à rien de traiter des pages non aspirées), il faudrait d’abord détecter l’encodage. Nous avons vu pendant la dernière séance qu'il est possible de stocker l'encodage dans une variable en utilisant :
encodage =$(file -i nomdufichier | cut -d= -f2)
Ensuite, l’encodage sera comparé à notre encodage visé (utf-8) avec une condition "if". Le traitement des pages sera différent en fonction de son encodage.
if [ $encodage = “utf-8” ]; then
…procéder avec le lynx
Si l’encodage est déjà en UTF-8, récupérer le contenu textuel de la page via un lynx ne pose pas de problèmes.
Comme nous avons vu la dernière fois, nous pouvons récupérer le contenu textuel ainsi :
lynx -dump -nolist -display_charset=$encodage ./PAGES-ASPIREES/$langue/$i.html > ./DUMP-TEXT/$langue/$i-utf8.txt
Si l’encodage n’est pas en UTF-8...
else
…convertir le texte en UTF-8 pour enfin faire le lynx
fi ;
...il faudrait le convertir, ou au moins essayer de le convertir. Il y a des limitations : il faut d’abord que la commande file détecte bien le bon encodage du fichier pour pouvoir le transcoder correctement. Ensuite, il faut que l’encodage soit reconnu par le système.
Un transcodage est possible si l’encodage détecté fait partie de la liste d’encodages supportés par la commande de transcodage.
La commande que nous allons utilisé est iconv.
Pour voir tous les charsets reconnus de iconv, nous pouvons afficher la liste à l’écran en tapant :
iconv –l
La liste est vaste ! Notre programme a besoin d’une manière de filtrer cette liste pour voir si notre encodage y apparaît. Le filtrage se fait par une nouvelle commande "egrep", qui est une commande de filtrage (affichant seulement les objets qui correspondent à un motif donné).
En passant notre grande liste de charsets reconnus par un tube, nous pouvons ensuite filtrer la liste par rapport à notre encodage choisi :
iconv –l | egrep -i “$encodage”
(l’option –i permet d’ignorer les distinctions de casse)
En testant avec des encodages différents, nous voyons que si un encodage dans la liste continent le motif sélectionné (notre encodage), une liste des encodages correspondants sera affichée. S’il n’y a pas d’encodages correspondants, rien ne sera affiché. ISO-8859-1, ASCII et bien sûr UTF-8 ont été reconnu. Mais l'encodage qui s'appelle "elvish" n'a pas été reconnu, et heuresement ! puisque ce n'est pas (à nos connaissances) un vrai encodage.
Ceci est utile pour nous. Cela nous permet de trier les encodages pour lesquels il y a un encodage correspondant dans la liste d’encodages reconnu de iconv, de ceux qui ne sont pas reconnus.
Si l’encodage est reconnu, "iconv" saura convertir le fichier en utf-8. Si, par contre, notre encodage n’est pas reconnu par "iconv", nous ne pouvons pas faire grand-chose pour le convertir. Pour l’instant, la solution sera d’abandonner la page.
Le résultat de "egrep" sera stocké dans une variable pour pouvoir utiliser la valeur plus tard. Si l’encodage n’est pas reconnu, la variable ne contiendra rien, et s’il est reconnu, l’encodage contiendra quelque chose.
reconnu = $(iconv –l | egrep -io “$encodage”)
La condition utilisée pour trier les pages à convertir des pages que nous ne serons pas capables de convertir sera de la forme :
if [ reconnu = “” ] ; then # si l’encodage n’est pas reconnu
rien à faire…
else # l’encodage est reconnu
Lynx et faire un dump initial du texte
Convertir le texte en utf-8 via un iconv
fi ;
La syntaxe pour convertir l’encodage d’un texte est :
iconv -f $encodage -t utf-8 ./DUMP-TEXT/$langue/$i.txt > ./DUMP-TEXT/$langue/$i-utf8.txt
La commande convertit notre encodage en UTF via les options –f (from /de) et –t (to/à). Elle converti alors le dump-initial (le fichier $i.txt) en dump-utf (le fichier $i-utf8.txt)
Les étapes commencent à être beaucoup plus compliquées et maintenant il y a plusieurs conditions imbriquées. Afin de voir plus clair, un petit schéma ne fera pas de mal pour nous aider à ensuite structurer et écrire notre script :
Donc nous intégrons la conversion d'encodage et le dump des textes dans notre script principal, en faisant bien attention de finir chaque condition "if" avec un "fi".
Le tableau résultant a sept colonnes maintenant :
Le numéro du lien
Le lien vers le site web
Le code retour du curl
Le code retour http pour pouvoir comparer la fiabilité des deux codes
La page aspirée (peu importe le code retour, pour pouvoir vérifier la fiabilité des codes)
Le dump initial si la page n'est pas encodée mais que l'encodage est reconnu de iconv (plus l'encodage), ou juste l'encodage s'il n'est pas reconnu d'iconv
Le dump en utf-8 (directement en utf-8 pour les pages qui ont déjà cet encodage, et transcodé pour les pages encodées en un autre encodage reconnu d'iconv)
Les cellules rouges indiquent qu'il y a eu un erreur. Nous voyons des erreurs de code http qui indiquent que la page n'a pas été aspirée. Nous voyons aussi des erreurs liées aux encodages non reconnus de iconv (ligne 22 - unknown-8bit).
Malheuresement il semble qu'il y a toujours beaucoup d'erreurs d'aspiration signalées par le code retour http (nous avons vu que le code retour curl ne signale pas la moitié de ces erreurs). Nous espérons résoudre ce problème, ou au moins comprendre pourquoi certains sites (souvent provenant de la même source) entraînent des problèmes d'aspiration.