A TAL PROJECT by Larisa Nadel

Le script

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&deg; $i </b></td></tr>" >> $table;
	echo "<tr><td> n&deg 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

Quelques remarques

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.