mercredi 24 novembre 2010

A la recherche de l'utf-8

le script présenté ci-dessous permet de trouver le charset d'origine de chaque url.. Une fois l'encodage trouvé, s'il n'est pas en utf-8 nous devons tout d'abord le changer afin que toutes les urls soient en utf-8 grâce à la commande inconv. Et une fois le problème d'encodage réglé nous pouvons dumper les pages aspirées :

#!/bin/bash
echo "Donnez le nom du dossier contenant les fichiers de liens http : ";
read dossier;
echo "Donnez le nom du fichier html où stocker ces liens dans des tableaux : ";
read tablo;


echo "<html><head><title>tableau de liens</title></head><body>" >> $tablo;

i=1;


for fichier in `ls $dossier`
{
    echo "<table border=1>" >> $tablo;
   
    echo "<tr><td align="center" bgcolor=\"silver\" colspan=\"7\"><b>Fichier $fichier</b></td></tr>" >> $tablo;
    echo "<tr><td>Numéros</td><td>URLs</td><td>Pages aspirées</td><td>Dump initial</td><td>Dump utf-8</td><td>Contextes utf-8</td><td>Contextes html</td>" >> $tablo;   
   
   

   
   
    for nom in `cat $dossier/$fichier`
    {
    wget -O ../PAGES-ASPIREES/$i.html $nom
    retourwget=$? ;
        echo "RETOUR WGET : $retourwget";
        if [[ $retourwget == 0 ]]
        then
            encodage=$(file -i ../PAGES-ASPIREES/$i.html);
            echo "ENCODAGE initial : $encodage";
       
            if [[ $encodage == "utf-8" ]]
            then
               lynx -dump -nolist -display_charset=$encodage ../PAGES-ASPIREES/$i.html  > ../DUMP-TXT/$i-utf8.txt ;
            else
               echo "on cherche un charset dans la page aspiree...";
               if egrep -qi "(charset ?=.*?(\"|\')|encoding ?=.*?(\"|\'))" ../PAGES-ASPIREES/$i.html ;
                  then
                      echo "Presence d'un charset...";
                      encodage=$(egrep -m 1 -o '(((utf|UTF)-(8|16|32))|(gb|GB)(k|K|2312|18030)|(iso|ISO|Iso)-8859-(\w)(\w)?|(WINDOWS|windows)-1252|(WINDOWS|windows)-1256|((m|M)(a|A)(c|C)(R|r)(O|o)(M|m)(a|A)(n|N))|us-ascii)' ../PAGES-ASPIREES/$i.html | sort -u) ;
                      echo "charset extrait : $encodage ";
           
                      VERIFENCODAGEDANSICONV=$(iconv -l | egrep -io $encodage | sort -u);
                      if [[ $VERIFENCODAGEDANSICONV == "" ]]
                        then
                            echo "VERIF : <$VERIFENCODAGEDANSICONV> ==> inconnu par inconv, on ne fait rien"
                            echo "<tr><td align=\"center\" width=\"50\">$i</td><td align=\"center\" width=\"100\"><a href=\"$nom\">lien n°$i</a></td><td align=\"center\" width=\"100\"><a href=\"../PAGES-ASPIREES/$i.html\">$i.html</a></td><td align=\"center\" width=\"100\" bgcolor=\"aqua\"><small>Encodage<br/>non d&eacute;tect&eacute;</small></td><td align=\"center\" width=\"100\" bgcolor=\"aqua\"><small>Encodage<br/>non d&eacute;tect&eacute;</small></td><td align=\"center\" width=\"100\" bgcolor=\"aqua\"><small>Encodage<br/>non d&eacute;tect&eacute;</small></td><td align=\"center\" width=\"100\" bgcolor=\"aqua\"><small>Encodage<br/>non d&eacute;tect&eacute;</small></td></tr>" >> $tablo;
                        else
                            echo "VERIF : <$VERIFENCODAGEDANSICONV> ==> connu par inconv, c'est parti ==> lynx, iconv..."
                            lynx -dump -nolist -display_charset=$encodage ../PAGES-ASPIREES/$i.html  > ../DUMP-TXT/$i.txt ;
           
                            echo "ENCODAGE final : $encodage (avant conversion vers utf-8)";
                            iconv -f $encodage -t utf-8 ../DUMP-TXT/$i.txt > ../DUMP-TXT/$i-utf8.txt
                            echo "<tr><td align=\"center\" width=\"50\">$i</td><td align=\"center\" width=\"100\"><a href=\"$nom\">lien n°$i</a></td><td align=\"center\" width=\"100\"><a href=\"../PAGES-ASPIREES/$i.html\">$i.html</a></td><td align=\"center\" width=\"100\"><a href=\"../DUMP-TXT/$i.txt\">$i.txt</a><br/><small>($encodage)</small></td><td align=\"center\" width=\"100\"><a href=\"../DUMP-TXT/$i-utf8.txt\">$i-utf8.txt</a></td><td align=\"center\" width=\"100\"><a href=\"../CONTEXTES/$i-utf8.txt\">$i-utf8.txt</a></td><td align=\"center\" width=\"100\"><a href=\"../CONTEXTES/$i-utf8.html\">$i-utf8.html</a></td></tr>" >> $tablo;
                        fi
       
                   else
                      echo "Pas de charset detecte : on ne fait rien pour le DUMP... ";
                      echo "<tr><td align=\"center\" width=\"50\">$i</td><td align=\"center\" width=\"100\"><a href=\"$nom\">lien n°$i</a></td><td align=\"center\" width=\"100\"><a href=\"../PAGES-ASPIREES/$i.html\">$i.html</a></td><td align=\"center\" width=\"100\" bgcolor=\"aqua\"><small>Encodage<br/>non d&eacute;tect&eacute;</small></td><td align=\"center\" width=\"100\" bgcolor=\"aqua\"><small>Encodage<br/>non d&eacute;tect&eacute;</small></td><td align=\"center\" width=\"100\" bgcolor=\"aqua\"><small>Encodage<br/>non d&eacute;tect&eacute;</small></td><td align=\"center\" width=\"100\" bgcolor=\"aqua\"><small>Encodage<br/>non d&eacute;tect&eacute;</small></td></tr>" >> $tablo;
                   fi 
            fi
        else
           echo "<tr><td align=\"center\" width=\"50\">$i</td><td align=\"center\" width=\"100\"><a href=\"$nom\">lien n°$i</a></td><td align=\"center\" width=\"100\" bgcolor=\"red\">Page non aspiree...</td><td align=\"center\" width=\"100\" bgcolor=\"aqua\"><small>Encodage<br/>non d&eacute;tect&eacute;</small></td><td align=\"center\" width=\"100\" bgcolor=\"aqua\"><small>Encodage<br/>non d&eacute;tect&eacute;</small></td><td align=\"center\" width=\"100\" bgcolor=\"aqua\"><small>Encodage<br/>non d&eacute;tect&eacute;</small></td><td align=\"center\" width=\"100\" bgcolor=\"aqua\"><small>Encodage<br/>non d&eacute;tect&eacute;</small></td></tr>" >> $tablo;
        fi
    let "i+=1";
   
    }
   

    let "i+=1";
    let "j+=1";
}

    echo "</table>" >> $tablo;
    echo "<br>" >> $tablo;


echo "</body></html>" >> $tablo;


Problème!!!!!!!!!!! 

Certaines pages dont l'encodage n'est soit disant pas détecté ne sont pas dumpées.. Or lorsqu'on regarde le code source des pages html, on retrouve différents charset : utf-8; ISO 8859-* qui ne sont pas pris en compte par notre script....  WHYYYYYYYYYYYYYYYYYYYYYY????????

3 commentaires:

  1. Pour les pages en question, examinez en détail ce qu'affiche le script au moment de la détection du charset, il devrait afficher ce qu'il extrait à l'issue de cette commande :

    echo "charset extrait : $encodage ";

    s'il n'extrait ce que vous attendez de lui, pê qu'il faut intervenir au niveau de la regexp définie actuellement pour extraire les bons charsets de vos pages.

    SF

    RépondreSupprimer
  2. au moment de la détection du charset sur cygwin, il écrit bien charset extrait : iso-8859- ou utf-8 (par exemple) et pourtant sur le tableau il est indiqué qu'aucun charset n'a été détecté..

    on va chercher avec ce que vous nous avez dit

    merci

    GRoupe Parole

    RépondreSupprimer
  3. Si vous ne trouvez pas, envoyez moi votre script zippé sur mon adresse gmail, je regarderai...
    SF

    RépondreSupprimer