Case vide : problème d'encodage et solutions...
Dans le blog précédent, nous avons mentionné le problème de "case vide" concernant l'encodage. Et cette case vide nous obsède...
PLAN
Pourquoi elle est vide ?
Quelles sont les conséquences ?
Comment y résoudre ?
Pour répondre à ces questions, nous avons écrit un script pour tester et comparer des méthodes et des outils différents.
I Pourquoi elle est vide ?
Hypothèse 1 : la page n'a pas fourni son encodage dans l'entête.
Hypothèse 2 : l'outil que nous avons utilisé n'est pas propre.
Observation :
Il y a de nombreuses meta-données qui peuvent se confondre.
Analyse : Cela peut être lié à la syntaxe de HTML 4.
HTML 4.01: <meta http-equiv="content-type" content="text/html; charset=UTF-8">
HTML5: <meta charset="UTF-8">
Solution : fouiller dans le fichier html la balise meta contenant l'encodage. (voir le script infra.)
Désavantages : coûteux, moins efficace
II Quelles sont les conséquences ?
Hypothèse : des pages non utf-8 risquent d'être mal encodés lors de transformation.
Observation :
La commande lynx n'a pas pu décharger cette page.
Solution : il lui faut désigner l'encodage avec les options -assume_charset et -display_charset. (voir le script infra.)
III Comment y résoudre ?
Autres que des solutions supra, nous avons testé 1) la commande file -i FILE, 2) récupérer l'encodage spécifié dans la balise meta de fichier html et 3) la commande enca -L args FILE (voir le script infra.). Nous avons également envisagé 4) la commande iconv mais ne l'avons pas encore testée.
1) file
Désavantages : elle ne fonctionne que sur des fichiers locaux, ne peut pas tout connaître et fait des erreurs...
2) récupérer l'encodage spécifié dans la balise meta d'un fichier html.
Désavantages : coûteux, moins efficace. Quelque fois, l'encodage spécifié n'est pas le "vrai" encodage du fichier.
3) enca
Pour l'instant, elle fonctionne bien pour des URLs encodés en gbk/gb2312. elle est également capable de convertir des encodages.
Désavantages : elle peut connaître l'encodage à condition que nous désignions par avance la langue de ce fichier.
4) iconv
La commande iconv ne servir qu'à convertir des encodages; elle ne peut pas simplement connaître l'encodage.
Le test est détaillé dans les commentaires du script.
SCRIPT
#!bin/bash #Ce script permet de tester (DE MANIÈRE RUSTIQUE) l'encodage d'URLs avec des méthodes et des outils divers, #et de trouver une solution éventuelle pour la suite de notre travail #Contexte: 3 types de problèmes survenus lors de création de tableaux html #1)certains urls ne répondent pas leur encodage dans l'entête récupéré par curl -I (cf notre blog précédent) ; #2)certains sites (notamment des sites chinois avec gbk/gb2312 comme encodage) ne peuvent pas être déchargés par lynx. #3)pour un même url, l'encodage de son texte déchargé diffère celui de sa page aspirée. #pour y résoudre, il faut comparer des méthodes et des outils #PATH=$PATH:~/home/.../ProjetEncadre20172018/Test/ #TESTÉ avec 8 urls : 4 chinois dont 3 en utf-8 et 1 en gb2312; 4 français dont 3 en utf-8 et 1 en iso-8859-1 # echo "###########################################################################"; echo "test encoding... "; echo "###########################################################################"; file=./URLs_test; rep_page_aspiree=./PAGE; rep_dump_text=./TXT; rep_transforme=./Trans_TXT; echo "INPUT : URLs dans le fichire $file"; echo "OUTPUT : pages aspirées dans le rep $rep_page_aspiree"; echo "OUTPUT : textes déchargés dans le rep $rep_dump_text"; echo "###########################################################################"; line_iterator=0; for line in `cat $file` do let line_iterator++; page="$rep_page_aspiree/aspiree-$line_iterator.html"; dump="$rep_dump_text/dump-$line_iterator"; txt_trans="$rep_transforme/trans-$line_iterator"; ################################################################################ echo "$line_iterator $line"; #method 1 : récupérer directement dans l'entête en envoyant une demande curl -I (ce que nous avons utilisé dans le blog précédent) encodage_header_curl=`curl -sIL $line|grep -i -Po '(?<=charset=).+(?=\b)' |awk '{print tolower($0)}'`; echo "method 1: $encodage_header_curl : => curl -I header info charset"; #method 2 :trouver dans la page html la ligne contenant la balise meta et l'encodage, puis récupérer l'encodage dans le fichier aspiré; #1) trouver la chaîne qui correspond au motif 'meta.+charset' en ignorant la case, cela spécifie l'encodage paru dans la balise meta; #2) récupérer l'ensemble de cette ligne et la transformer au miniscule #3) trouver l'occurrence du motif "charset[=\s\'\"a-Z0-9\-]*" (en considérant des espaces, des guillemets). #4) récupérer l'encodage qui est délimité par = #5) enlever des espaces\guillemets éventuelles encodage_curl_page=`curl -sL $line|egrep -i 'meta.+charset' |awk '{print tolower($0)}'|egrep -o "charset[=\s\"a-Z0-9\-]*" |cut -d"=" -f2 | sed 's/\s//g'|sed 's/\"//g'`; echo "method 2: $encodage_curl_page : => parsing la page html with meta tag "; #method 3 : en principe, est de même que method 2, seule différence : fouiller dans la page locale curl -sL $line > $page; encodage_local_page=`egrep -i 'meta.+charset' $page |awk '{print tolower($0)}'|egrep -o "charset[=\s\"a-Z0-9\-]*" |cut -d"=" -f2 | sed 's/\s//g'|sed 's/\"//g'`; echo "method 3 : $encodage_local_page : => parsing local page with meta tag"; #method 4 : tester l'encodage de page aspirée avec la cmd file -i (file ne fonctionne uniquement avec des fichiers locals) encodage_cmd_file=`file -i $page`; echo "method 4 : $encodage_cmd_file : => encodage de page locale interprétée par cmd file : "; #!!!!!!!! #method 5 : tester avec la cmd enca (fixons la langue en chinois, qui est l'origine de la plupart des problèmes) #(ie. pour l'instant, pas de structure de contrôle, on ignore des url en fr) encodage_cmd_enca=`enca -L zh_CN $page`; echo "method 5 : $encodage_cmd_enca : => encodage_cmd_enca de page locale"; ######################################################################################## #désigner l'encodage par $encodage_curl_page lynx -dump -nolist -assume_charset=%{charset} -display_charset=$encodage_curl_page $line > $dump; ######################################################################################## #voir l'encodage de texte déchargé par la cmd file encodage_texte_dump=`file -i $dump`; echo "Dump text en : $encodage_texte_dump => par cmd file "; # convertir l'encodage de texte déchargé vers utf8 par la cmd iconv # alternative : enca / utrac, #txt_trans=`iconv -f $encodage_curl_page -t utf-8 $dump`; # voir l'encodage de texte après être transformé #encodage_txt_trans=`file -i $txt_trans`; #echo "Texte transformé en : $encodage_txt_trans => transformé par iconv, vu par file "; echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"; done;
TEST LOG
########################################################################### test encoding... ########################################################################### INPUT : URLs dans le fichire ./URLs_test OUTPUT : pages aspirées dans le rep ./PAGE OUTPUT : textes déchargés dans le rep ./TXT ########################################################################### 1 http://paper.people.com.cn/rmrb/html/2017-08/19/nw.D110000renmrb_20170819_4-11.htm method 1: : => curl -I header info charset method 2: utf-8 : => parsing la page html with meta tag method 3 : utf-8 : => parsing local page with meta tag method 4 : ./PAGE/aspiree-1.html: text/html; charset=utf-8 : => encodage de page locale interprétée par cmd file : method 5 : Universal transformation format 8 bits; UTF-8 CRLF line terminators : => encodage_cmd_enca de page locale Dump text en : ./TXT/dump-1: text/plain; charset=utf-8 => par cmd file ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2 http://finance.people.com.cn/n1/2016/1207/c1004-28931370.html method 1: : => curl -I header info charset method 2: gb2312 : => parsing la page html with meta tag method 3 : gb2312 : => parsing local page with meta tag method 4 : ./PAGE/aspiree-2.html: text/html; charset=iso-8859-1 : => encodage de page locale interprétée par cmd file : method 5 : Simplified Chinese National Standard; GB2312 : => encodage_cmd_enca de page locale Dump text en : ./TXT/dump-2: text/plain; charset=iso-8859-1 => par cmd file ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3 http://zqb.cyol.com/html/2017-05/09/nw.D110000zgqnb_20170509_3-10.htm method 1: : => curl -I header info charset method 2: utf-8 : => parsing la page html with meta tag method 3 : utf-8 : => parsing local page with meta tag method 4 : ./PAGE/aspiree-3.html: text/html; charset=utf-8 : => encodage de page locale interprétée par cmd file : method 5 : Universal transformation format 8 bits; UTF-8 CRLF line terminators : => encodage_cmd_enca de page locale Dump text en : ./TXT/dump-3: text/plain; charset=utf-8 => par cmd file ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4 http://epaper.oeeee.com/epaper/H/html/2017-08/15/content_60134.htm method 1: : => curl -I header info charset method 2: utf-8 : => parsing la page html with meta tag method 3 : utf-8 : => parsing local page with meta tag method 4 : ./PAGE/aspiree-4.html: text/html; charset=utf-8 : => encodage de page locale interprétée par cmd file : method 5 : Universal transformation format 8 bits; UTF-8 Mixed line terminators : => encodage_cmd_enca de page locale Dump text en : ./TXT/dump-4: text/plain; charset=utf-8 => par cmd file ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5 http://www.lemonde.fr/festival/article/2017/09/24/c-est-une-sex-doll-qui-fait-non-non-non_5190360_4415198.html?xtmc=intelligence_artificielle&xtcr=2 method 1: utf-8 : => curl -I header info charset method 2: utf-8 : => parsing la page html with meta tag method 3 : utf-8 : => parsing local page with meta tag method 4 : ./PAGE/aspiree-5.html: text/html; charset=utf-8 : => encodage de page locale interprétée par cmd file : method 5 : Universal transformation format 8 bits; UTF-8 : => encodage_cmd_enca de page locale Dump text en : ./TXT/dump-5: text/plain; charset=utf-8 => par cmd file ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 6 http://www.lefigaro.fr/secteur/high-tech/2017/05/11/32001-20170511ARTFIG00013-microsoft-prepare-un-assistant-virtuel-pour-contrer-amazon-et-google.php method 1: utf-8 : => curl -I header info charset method 2: utf-8 : => parsing la page html with meta tag method 3 : utf-8 : => parsing local page with meta tag method 4 : ./PAGE/aspiree-6.html: text/html; charset=utf-8 : => encodage de page locale interprétée par cmd file : method 5 : Universal transformation format 8 bits; UTF-8 : => encodage_cmd_enca de page locale Dump text en : ./TXT/dump-6: text/plain; charset=utf-8 => par cmd file ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 7 http://next.liberation.fr/livres/2017/09/20/weyembergh-redessine-un-autre-futur_1597702 method 1: utf-8 : => curl -I header info charset method 2: utf-8 : => parsing la page html with meta tag method 3 : utf-8 : => parsing local page with meta tag method 4 : ./PAGE/aspiree-7.html: text/html; charset=utf-8 : => encodage de page locale interprétée par cmd file : method 5 : Universal transformation format 8 bits; UTF-8 : => encodage_cmd_enca de page locale Dump text en : ./TXT/dump-7: text/plain; charset=utf-8 => par cmd file ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 8 http://www.univ-paris3.fr/ method 1: iso-8859-1 : => curl -I header info charset method 2: iso-8859-1 : => parsing la page html with meta tag method 3 : iso-8859-1 : => parsing local page with meta tag method 4 : ./PAGE/aspiree-8.html: text/html; charset=iso-8859-1 : => encodage de page locale interprétée par cmd file : method 5 : Unrecognized encoding : => encodage_cmd_enca de page locale Dump text en : ./TXT/dump-8: text/plain; charset=iso-8859-1 => par cmd file ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
REMARQUE
file fait des erreurs, par exemple, le URL N° 2 est encodé en gb2312, mais la commande l'a détecté comme iso-8859-1. Nous ne pouvons pas compter sur cette commande.
CONCLUSION
En conclusion, pour à la fois connaître et convertir des encodages, nous pouvons opter entreenca + iconv,
enca + enca,
2) + iconv et
2) + enca.
Pour la suite, nous allons intégrer ces méthodes/outils au fur et à mesure dans notre travail...