mardi 10 décembre 2013

Encodage n'est pas en utf-8...

Mais si la page n'est pas en utf-8, là on a un outil très pratique qui s'appelle iconv et qui permet de convertir l'encodage en utf-8.

Cependant, l'encodage affiché par la commande file peut ne pas être reconnu par iconv. Dans ce cas-là on introduit une variable intermédiaire verifEncodIconv pour vérifier si iconv reconnaît l'encodage ou pas:

if [ $verifEncodIconv != "" ]; then
           
    # L'encodage de la page est dans la liste des encodages supportés par iconv (=n'est pas une chaîne vide), on dump la page avec lynx
    lynx -dump -nolist -display_charset=$encodage $url > ./DUMP-TEXT/$i/$j.txt;

    # On convertit la page en utf-8 dans le fichier $j-utf8.txt
    iconv -f $encodage -t UTF-8 ./DUMP-TEXT/$i/$j.txt >> ./DUMP-TEXT/$i/$j-utf8.txt;

Juste après, on recherche de nouveau le motif et le nombre d'occurrences.



Si l'encodage n'est pas dans la liste des encodages supportés par iconv, on a encore une déviation, c'est d'aller regarder des informations supplémentaires dans la page html. 
Pour cela, on va chercher une ligne dans la section <head> du fichier de la forme <meta http-equiv="Content-Type" content="text/html; charset=something-strange-here" />. 
On va plus particulièrement chercher à récupérer la chaîne de caractères qui se trouve après charset=.
Pour cela, on va utiliser egrep avec l'option -i pour ignorer la case (majuscule/minuscule) et l'option -o pour matcher uniquement l'expression régulière fournie en paramètres, et non pas toute la ligne.
egrep renvoie une chaîne 'charset=encodage_de_la_page', on utilise cut pour récupérer le deuxième champ en utilisant "=" comme séparateur de champ:

encodage=$(cat ./PAGES-ASPIREES/$i/$j.html | egrep -io 'charset=[^"]+' | cut -d= -f2);

Ensuite, on vérifie que la variable $encodage n'est pas une chaîne vide. Si c'est le cas (=est une chaîne vide), cela voudrait dire qu'il n'y a pas d'informations d'encodage dans l'en-tête (head) de la page html.
Nous ne sommes donc pas en mesure de trouver (facilement) l'encodage de la page. On ne perd pas plus de temps avec cette page problématique, on passe à la suivante.
 




Si la variable $verifEncodIconv n'est pas une chaine vide..., on revient à notre scénario déjà vu: on dump la page avec lynx, on la convertit en utf-8, on cherche le motif et on calcule le nombre d'occurrences...
                  







Aucun commentaire:

Enregistrer un commentaire