Accéder au contenu principal

#Article 6 : Les encodages


Nous avons, lors de notre précédent billet, expliqué comment nous avions conçu un script Bash nous permettant de construire un tableau donnant, pour chaque URL que nous avions aspirée, son code retour HTML, son encodage ainsi que des liens vers la page web correspondante et son code source.
Nous avons lors du dernier cours amélioré ce tableau.
D’une part, lorsque le code retour n’est pas « 200 », nous avons décidé de laisser vides les colonnes suivantes, puisque cela signifie que la page n’est de toutes façons pas exploitable. Pour cela nous avons utilisé la structure conditionnelle suivante :
if [[ $coderetour == 200 ]]
then
               encodage=$(curl -SIL -o tmp.txt -w %{content_type} $ligne |cut -f2 -d"="|tr '[a-z]' '[A-Z]' | tr -d '\r' | tr -d "\"");
               curl -L -o "./PAGES-ASPIREES/$numerotableau-$compteur.html" "$ligne";
               echo "<tr><td>$compteur </td><td><a href=\"$ligne\"target=\"_blank\">$ligne</a></td><td>CODE RETOUR=$coderetour</td><td>ENCODAGE = $encodage</td><td><a href=\"../PAGES-ASPIREES/$numerotableau-$compteur.html\">$numerotableau-$compteur.html</a></td></tr>" >> $2/tableau.html;
else
               echo "<tr><td>$compteur </td><td><a href=\"$ligne\"target=\"_blank\">$ligne</a></td><td>CODE RETOUR=$coderetour</td><td>-</td><td>-</td>td>-</td></tr>" >> $2/tableau.html;
fi

Dans une structure conditionnelle, if introduit la condition, que l’on place entre doubles crochets (en n’oubliant pas les espaces). Puis then, précédé d’une indentation, introduit la commande que l’on veut voir effectuée si la condition est remplie. Dans le cas où l’on souhaite qu’une autre commande soit effectuée si la condition n’est pas remplie, on utilise else (puis une indentation mais, cette fois, sans then) On clôt la structure conditionnelle avec fi (if à l’envers).

Ensuite, nous avons ajouté une colonne au tableau, dans laquelle nous avons placé un lien vers un fichier contenant le texte de la page. Pour aspirer le contenu texte d’une page web, nous avons utilisé la commande lynx et ses fonctionnalités -dump pour extraire le texte, -nolist pour ne pas avoir l’indexation des url, assume-charset pour préciser la nature de l’encodage à l’entrée, et enfin display-charset pour afficher la nature de l’encodage à la sortie. Un fichier est ainsi créé pour chaque URL et placé dans le répertoire DUMP-TEXT, puis un lien vers ce fichier est ajouté dans la dernière colonne du tableau.
Il convient de préciser que nous utilisons la commande lynx non pas directement sur l’URL, mais sur le fichier contenant le code source que nous avons aspiré et se trouvant dans le répertoire PAGES-ASPIREES. Ainsi nous passons outre d’éventuelles barrières qui nous empêcheraient de récupérer les données de certains sites.
La commande est la suivante :
lynx -dump -nolist -assume-charset=$encodage -display-charset=$encodage "./PAGES-ASPIREES/$numerotableau-$compteur.html" > ./DUMP-TEXT/$numerotableau-$compteur.txt;
echo "<tr><td>$compteur </td><td><a href=\"$ligne\"target=\"_blank\">$ligne</a></td><td>CODE RETOUR=$coderetour</td><td>ENCODAGE = $encodage</td><td><a href=\"../PAGES-ASPIREES/$numerotableau-$compteur.html\">$numerotableau-$compteur.html</a></td><td><a href=\"../DUMP-TEXT/$numerotableau-$compteur.txt\">$numerotableau-$compteur.txt</a></td></tr>" >> $2/tableau.html;

Nous avons également amélioré notre commande permettant de trouver l’encodage de la page. En effet, nous avions remarqué que la commande que nous avions trouvée n’était pas satisfaisante car l’encodage ne se trouve pas toujours à la 2e ligne du protocole html. Ainsi, sur le même modèle que la commande permettant d’extraire le code source, existe la commande suivante : curl -SIL -o tmp.txt -w %{content_type}
Cette commande retournera tout ce qui suit « Content-type », par exemple : text/html ; charset=UTF-8
Afin de n’extraire que l’encodage (par exemple ici UTF-8), nous complétons la commande ainsi : curl -SIL -o tmp.txt -w %{content_type} $ligne |cut -f2 -d"="|tr '[a-z]' '[A-Z]' | tr -d '\r' | tr -d "\"")
Nous récupérons ainsi uniquement ce qui suit le « = », le passons en majuscule et nous supprimons d’éventuels guillemets et retour à la ligne. Le passage en majuscules a deux motivations : pouvoir demander ensuite si « encodage == "UTF-8" » et, s’il ne s’agit pas d’UTF-8, pouvoir le trouver dans la liste de la commande iconv (voir les explications qui suivent).

Nous souhaitons maintenant convertir les fichiers du répertoire DUMP-TEXT en UTF-8 lorsqu’ils ont un encodage différent, grâce à la commande iconv. Nous avons pour cela encore besoin d’une structure conditionnelle (que nous imbriquons dans la première puisque nous ne cherchons l’encodage que si le code retour est égal à 200).
Tout d’abord, nous souhaitons savoir si (if) l’encodage est en UTF-8. Si c’est le cas, nous aspirons le texte de la page avec lynx et ajoutons le lien dans le tableau comme vu plus haut. Sinon (else), il nous faut vérifier que l’encodage extrait avec notre commande curl est bien un encodage existant, et si ce n'est pas le cas trouver une autre manière de récupérer l’encodage de la page. Une fois l’encodage trouvé, il nous faut convertir le texte en UTF-8. Nous arrivons là au travail que nous devions effectuer seuls pendant les vacances de la Toussaint. Voici la solution que nous proposons.

Nous commençons par vérifier que l’encodage que nous avons extrait se trouve dans la liste des encodages pris en charge par la commande iconv que nous souhaitons utiliser. Pour cela nous affichons cette liste avec la commande iconv -l puis nous y cherchons notre encodage avec la fonction egrep –oi (et comme certains encodages apparaissent plusieurs fois dans la liste, nous ajoutons uniq). Nous enregistrons le résultat dans une variable. Voici la commande pour cela :
encodage=$(iconv -l | egrep -oi $encodage | uniq)

Si cette dernière est vide (if [[ $encodage == "" ]]), cela signifie que l’encodage que nous avions n’est pas valide (sinon nous pouvons déjà le convertir comme nous le verrons plus loin). Nous essayons donc une 2e technique pour trouver l’encodage. Cette seconde technique consiste à chercher dans le code source si l’encodage a été spécifié. Nous cherchons donc dans le fichier du répertoire PAGES-ASPIREES la ligne où se trouve la mention « charset » (si elle existe). En ne récupérant dans cette ligne que ce qui suit le « charset= » (pour cela nous utilisons la commande sed et remplaçons cette chaîne de caractère par un simple caractère qui pourra ainsi servir de délimiteur avec cut), puis dans cette sélection seulement ce qui précède le premier espace (et en supprimant guillemets, balise fermante etc. comme précédemment), nous obtenons un nouvel encodage que nous vérifions comme le précédent :
encodage=$(egrep "charset" "./PAGES-ASPIREES/$numerotableau-$compteur.html"| sed –r "s/charset=/%/g" | cut -f2 -d"%"|cut -f1 -d" "|tr '[a-z]' '[A-Z]' | tr -d '(\r|\"|/>)');
encodage= $(iconv -l | egrep -oi $encodage | uniq)
if [[ $encodage == "" ]]

Si le résultat n’est toujours pas valide alors nous nous arrêtons là et ne récupérons pas le texte de la page : 
               then
               echo "<tr><td>$compteur </td><td><a href=\"$ligne\"target=\"_blank\">$ligne</a></td><td>CODE RETOUR=$coderetour</td><td>ENCODAGE = $encodage</td><td><a href=\"../PAGES-ASPIREES/$numerotableau-$compteur.html\">$numerotableau-$compteur.html</a></td><td>-</td></tr>" >> $2/tableau.html;

Sinon, nous récupérons le texte, et si l’encodage n’est pas en UTF-8, nous le convertissons avec iconv -f encodage_source -t encodage_cible fichier. Puis nous ajoutons le lien dans la dernière colonne du tableau.

else
               lynx -dump -nolist -assume-charset=$encodage -display-charset=$encodage "./PAGES-ASPIREES/$numerotableau-$compteur.html" > ./DUMP-TEXT/$numerotableau-$compteur.txt;
               if [[ $encodage != "UTF-8" ]]
                              then
iconv -f $encodage -t UTF-8 ./DUMP-TEXT/$numerotableau-$compteur.txt
               fi
               echo "<tr><td>$compteur </td><td><a href=\"$ligne\"target=\"_blank\">$ligne</a></td><td>CODE RETOUR=$coderetour</td><td>ENCODAGE = $encodage</td><td><a href=\"../PAGES-ASPIREES/$numerotableau-$compteur.html\">$numerotableau-$compteur.html</a></td><td><a href=\"../DUMP-TEXT/$numerotableau-$compteur.txt\">$numerotableau-$compteur.txt</a></td></tr>" >> $2/tableau.html;
fi

Voici la boucle complète :



Ce script ne semble pas parfait car nous constatons encore quelques messages d’erreur lors du lancement du programme et, en effet, il manque encore quelques encodages dans le tableau. La commande egrep sur le code source de l’URL ne semble pas prendre en compte toutes les possibilités. De plus, en la testant sur un des fichiers dont il manque l’encodage dans le tableau, nous remarquons qu’elle retourne une chaîne de caractère avec un espace, ce qui ne devrait pas être possible avec la fonction cut -d“ ”. Il nous reste donc encore à trouver une solution à ce problème, lors d’un prochain billet.

Commentaires

Posts les plus consultés de ce blog

#Article 3 Présentation du projet

Le sujet de notre projet est le résultat d’un débat qu’il nous semble intéressant de relater ici. Lorsque nous avons constitué notre équipe, ayant tous les trois un intérêt commun pour le gaming - les jeux vidéos -, nous avions convenu que notre projet porterait sur ce thème. Le mot « gaming » en lui-même ne nous semblant pas présenter d’intérêt linguistique particulier - en dehors de l’emprunt linguistique qu’il représente -, il nous restait donc encore à préciser le sujet. Deux idées ont alors émergé. D’un côté, nous nous sommes intéressés à l’e-sport, une discipline en plein essor depuis la fin des années 1980 dont le statut est discuté (est-ce un sport ? Peut-on véritablement en faire son métier ?) et dont la popularité et l’image peuvent différer significativement d’un pays à l’autre. D’un autre côté, nous avons pensé à étudier les différents mots servant à désigner les personnes en lien, de près ou de loin, avec le monde des « gamers ». Les mots « geek »

#Première étape du projet : Création du corpus

Rappel du mot d’étude : geek Rappel des langues étudiées : français, anglais, allemand, italien, japonais L’analyse linguistique que nous comptons réaliser concernant le mot geek sur le web se fonde sur un corpus que nous allons construire. Mais avant de s’intéresser à la partie informatique du problème, il convient d’établir les limites et la nature de ce fameux corpus multilingue.  Réflexion sur le corpus : Premièrement, nous souhaitons que les urls sélectionnées aient été créées au cours des cinq dernières années. La raison de ce choix se base sur le fait que nous souhaitons réaliser une étude synchronique du mot geek et non pas diachronique. Nous pensons qu’une période de cinq ans représente une durée suffisamment longue pour avoir de nombreuses données, tout en limitant les risques de biais que représentent les stéréotypes qui circulaient sur les geeks par le passé tels que “les geeks sont des personnes asociales qui restent enfermées toute la jo

#Article 10 : Création du Site Web

Ce dixième et dernier article du blog aura pour objet la création de notre site web associé au projet. Nous avons choisi une mise en forme personnalisée, sur la base d'un modèle trouvé en ligne, et, ayant tous les trois quelques connaissances en HTML/CSS, nous avons ajouté et modifié nous-mêmes les pages dudit site. Il reprend certaines parties de ce blog: présentation de l'équipe, du projet. Nous y avons ajouté une section traitant des programmes utilisés tout au long de notre recherche, ainsi qu'une page dédiée aux données traitée. Par la suite, une section se consacre au script et à son écriture, une aux résultats obtenus, et enfin une à l'analyse de ces résultats. Contrairement à ce blog, le site contiendra plus de visuels et sera probablement un peu plus agréable dans sa navigation. Pour pouvoir travailler ensemble sur les fichiers, ceux-ci ont été partagés sur un drive commun. En effet, il serait autrement compliqué d'y avoir accès aisément depuis différentes