Voici le script utilisé pour construir le tableau.
#!/bin/bash read REP; read table; read motif; echo "<html><head><meta charset=\"utf-8\"/><title>Tableaux d'URLs</title></head><body>" > $table echo "<p align= \"center\" width=\"100%\"></p>" >> $table echo "<table border=\"2\" align=\"center\" width=\"100%\">" >>$table i=1; for file in `ls $REP` do mkdir ../PAGES-ASPIREES/PAGESDE$file; mkdir ../DUMPTEXT/TXT_$file; mkdir ../CONTEXTES/CNTXT_$file; echo "<tr><td colspan=\"7\" align= \"center\"><b>Tableau n° $i </b></td></tr>" >> $table; echo "<tr><td> n° URL</td><td>URL</td><td>Page aspirée</td><td>Résultat d'aspiration</td><td>Texte initial</td><td>Texte en UTF-8</td><td>Contexte</td></tr>" >> $table; j=1; for url in `cat $REP/$file` do #---------------Vérification de la réponse du serveur-----------------------------# curl -m 10 -D header.txt $url -o ../PAGES-ASPIREES/PAGESDE$file/$j.html retourcurl=$? controlcurl=$(egrep -i -o "Not Found|Bad request|Service Unavailable|Moved Permanently|Forbidden" header.txt); rm header.txt if [ "$controlcurl" != "" ] then retourcurl="$controlcurl"; echo "curl $url -m 10 -o ../PAGES-ASPIREES/PAGESDE$file/$j.html">>err.txt; fi echo "RETOUR CURL: $retourcurl"; if [ "$retourcurl" = "0" ] then #----------------------Détection d'éncodage: UTF-8 ou ASCII et traitement---------------------------------------# encod1=$(file -b --mime-encoding ../PAGES-ASPIREES/PAGESDE$file/$j.html); if [ $encod1 = "utf-8" ] then echo "ENCODAGE INITIAL : $encod1"; lynx -dump -nolist -assume_charset=$encod1 -display_charset=$encod1 ../PAGES-ASPIREES/PAGESDE$file/$j.html > ../DUMPTEXT/TXT_$file/$j-utf8.txt perl ../MINIGREP/minigrepmultilingue.pl "UTF-8" ../DUMPTEXT/TXT_$file/$j-utf8.txt ../MINIGREP/motif-regexp.txt mv ./resultat-extraction.html ../CONTEXTES/CNTXT_$file/$j-utf8.html egrep -i -m 1 "googled|googlé|гуглил" ../DUMPTEXT/TXT_$file/$j-utf8.txt >> ../CONTEXTES/CNTXT_$file/cont_$i.txt; cat ../DUMPTEXT/TXT_$file/$j-utf8.txt >> ../DUMPTEXT/TXT_$file/text_$i.txt echo "<tr><td align=\"center\" width=\"50\">$j</td><td align=\"center\" width=\"100\"><a href=\"$url\">$url</a></td><td align= \"center\" width=\"70\"><a href= \"../PAGES-ASPIREES/PAGESDE$file/$j.html\">Page$j</a></td><td align= \"center\" width=\"50\">$retourcurl</td><td align= \"center\" width=\"50\">-</td><td align= \"center\" width=\"100\"><a href= \"../DUMPTEXT/TXT_$file/$j-utf8.txt \">$j-utf8.txt</a></td><td align= \"center\" width=\"100\"><a href= \"../CONTEXTES/CNTXT_$file/$j-utf8.html \">$j-utf8.html</a></td></tr>" >> $table else if [ $encod1 = "us-ascii" ] then echo "ENCODAGE INITIAL : $encod1"; lynx -dump -nolist -assume_charset=$encod1 -display_charset=$encod1 ../PAGES-ASPIREES/PAGESDE$file/$j.html > ../DUMPTEXT/TXT_$file/$j.txt; iconv -f $encod1 -t utf-8 "../DUMPTEXT/TXT_$file/$j.txt" > "../DUMPTEXT/TXT_$file/$j-utf8.txt"; perl ../MINIGREP/minigrepmultilingue.pl "UTF-8" ../DUMPTEXT/TXT_$file/$j-utf8.txt ../MINIGREP/motif-regexp.txt mv ./resultat-extraction.html ../CONTEXTES/CNTXT_$file/$j-utf8.html egrep -i -m 1 "googled|googlé|гуглил" ../DUMPTEXT/TXT_$file/$j-utf8.txt >> ../CONTEXTES/CNTXT_$file/cont_$i.txt; cat ../DUMPTEXT/TXT_$file/$j-utf8.txt >> ../DUMPTEXT/TXT_$file/text_$i.txt echo "<tr><td align=\"center\" width=\"50\">$j</td><td align=\"center\" width=\"100\"><a href=\"$url\">$url</a></td><td align= \"center\" width=\"70\"><a href= \"../PAGES-ASPIREES/PAGESDE$file/$j.html\">Page$j</a></td><td align= \"center\" width=\"50\">$retourcurl</td><td align= \"center\" width=\"50\"><a href= \"../DUMPTEXT/TXT_$file/$j.txt \">$j.txt</a><br/>($encod1)</td><td align= \"center\" width=\"100\"><a href= \"../DUMPTEXT/TXT_$file/$j-utf8.txt \">$j-utf8.txt</a></td><td align= \"center\" width=\"100\"><a href= \"../CONTEXTES/CNTXT_$file/$j-utf8.html \">$j-utf8.html</a></td></tr>" >> $table; #-------------------------------Autres codages: détection dans les métadonnées et traitement----------------------------# else if egrep -qi ".*charset ?=.*" ../PAGES-ASPIREES/PAGESDE$file/$j.html then charset_line=$(egrep -m 1 "charset=.*\"" ../PAGES-ASPIREES/PAGESDE$file/$j.html); echo $charset_line; charset=$(expr "$charset_line" : '.*charset="\?\(.*\)"'); # regexp a ameliorer echo "encodage extrait des metadonnees : $charset"; verif_iconv=`iconv -l | egrep -io $charset` if [ "$verif_iconv" != "" ] then echo "encodage extrait connu"; lynx -dump -nolist -assume_charset=$charset -display_charset=$charset ../PAGES-ASPIREES/PAGESDE$file/$j.html > ../DUMPTEXT/TXT_$file/$j.txt ; iconv -f $charset -t utf-8 "../DUMPTEXT/TXT_$file/$j.txt" > "../DUMPTEXT/TXT_$file/$j-utf8.txt"; perl ../MINIGREP/minigrepmultilingue.pl "UTF-8" ../DUMPTEXT/TXT_$file/$j-utf8.txt ../MINIGREP/motif-regexp.txt mv ./resultat-extraction.html ../CONTEXTES/CNTXT_$file/$j-utf8.html egrep -i -m 1 "googled|googlé|гуглил" ../DUMPTEXT/TXT_$file/$j-utf8.txt >> ../CONTEXTES/CNTXT_$file/cont_$i.txt; cat ../DUMPTEXT/TXT_$file/$j-utf8.txt >> ../DUMPTEXT/TXT_$file/text_$i.txt echo "<tr><td align=\"center\" width=\"50\">$j</td><td align=\"center\" width=\"100\"><a href=\"$url\">$url</a></td><td align= \"center\" width=\"70\"><a href= \"../PAGES-ASPIREES/PAGESDE$file/$j.html\">Page$j</a></td><td align= \"center\" width=\"50\">$retourcurl</td><td align= \"center\" width=\"50\"><a href= \"../DUMPTEXT/TXT_$file/$j.txt \">$j.txt</a><br/>($charset)</td><td align= \"center\" width=\"100\"><a href= \"../DUMPTEXT/TXT_$file/$j-utf8.txt \">$j-utf8.txt</a></td><td align= \"center\" width=\"100\"><a href= \"../CONTEXTES/CNTXT_$file/$j-utf8.html \">$j-utf8.html</a></td></tr>" >> $table; #----------------------Encodage non detecté, on ne trait pas-------------------------------------# else echo "echec: encodage extrait inconnu"; echo "<tr><td align=\"center\" width=\"50\">$j</td><td align=\"center\" width=\"100\"><a href=\"$url\">$url</a></td><td align= \"center\" width=\"70\"><a href= \"../PAGES-ASPIREES/PAGESDE$file/$j.html\">Page$j</a></td><td align= \"center\" width=\"50\">$retourcurl</td><td align= \"center\" width=\"50\">Encodage inconnu</td><td align= \"center\" width=\"100\">No text</td><td align= \"center\" width=\"100\">No context</td></tr>" >> $table; fi else echo "echec: encodage non precise dans les metadonnees"; echo "<tr><td align=\"center\" width=\"50\">$j</td><td align=\"center\" width=\"100\"><a href=\"$url\">$url</a></td><td align= \"center\" width=\"70\"><a href= \"../PAGES-ASPIREES/PAGESDE$file/$j.html\">Page$j</a></td><td align= \"center\" width=\"50\">$retourcurl</td><td align= \"center\" width=\"50\">Encodage non detecte</td><td align= \"center\" width=\"100\">No text</td><td align= \"center\" width=\"100\">No context</td></tr>" >> $table; fi fi fi else echo "retour curl diff 0"; echo "<tr><td align=\"center\" width=\"50\">$j</td><td align=\"center\" width=\"100\"><a href=\"$url\">$url</a></td><td align= \"center\"><a href= \"../PAGES-ASPIREES/PAGESDE$file/$j.html\">Page$j</a></td><td align= \"center\" width=\"50\">$retourcurl</td><td align= \"center\" width=\"50\">Page non aspiree</td><td align= \"center\" width=\"100\">No text</td><td align= \"center\" width=\"100\">No context</td></tr>" >> $table; fi j=$((j+1)); # La 2eme boucle se ferme done # Le tableau se ferme echo "<tr><td align=\"center\" width=\"50\"> </td><td align=\"center\" width=\"100\"> </td><td align= \"center\"></td><td align= \"center\" width=\"50\"> </td><td align= \"center\" width=\"50\"> </td><td align= \"center\" width=\"100\"><a href=../DUMPTEXT/TXT_$file/text_$i.txt>Texte global</a></td><td align= \"center\" width=\"100\"><a href=../CONTEXTES/CNTXT_$file/cont_$i.txt>Contexte global</a></td></tr>" >> $table; i=$((i+1)); echo "<p align=\"center\"></p>" >> $table; # La 1re boucle se ferme done echo "</table>" >> $table; echo "</body></html>" >> $table;
Le programme est organisé en deux boucles qui traitent tous les URLs en tous les fichiers (où un fichier correspond à chaque langue). Les commandes principales utilisées pour le traitement sont les suivantes:
curl -D: permet de stocker la page sur l'ordinateur, ainsi que vérifier que le contenu de la page est accessible
lynx -dump: extrait le texte de la page
file -b --mime-encoding: détecte l'encodage de la page
egrep + expr: cherchent l'encodage dans les métadonnées, s'il est pas détecté par file
iconv: le cas échéant, transforme l'encodage en utf-8
minigrep: extrait le contexte autour du mot choisi
J'ai essayé améliorer un peut le programme afin de l'adapter à mes objectifs:
1. Le message d'échec (e.g. Not Found) est cherché par curl -D diréctement dans le header de la page, où la réponse du serveur se trouve. C'est beacoup plus effectif qu'examiner une page... écrite par les humains ;)
2. Les "Bad Requests" sont completement battus. Leur cause la plus populaire: une liste des URLs crée sous Windows et traitée sous Ubuntu.
3. En effet, la commande file ne précise pas l'éncodage, elle peut seulement indiquer si le texte est en ascii, en utf-8 ou bien s'il est codé autrement. C'est exactement à quoi 'file' sert dans notre programme.
4. Enfin, la clef '-assume_charset' passe à lynx l'information sur l'éncodage initial du texte à traiter. Cela est absolument necessaire pour décoder les textes en russe.