title

Projet Multilingue des Mots sur le Web

Python


Démarche de travail

La démarche de travail à suivre est quasiment identique à celle du projet en Bash. Les différences résident dans les commandes utilisées pour effectuer chaque étape et bien sûr dans les particularités du langage python. Certaines étapes se sont avérées plus simples ; d'autres un peu plus problématiques.

Aspiration des pages (et stockage local)
Lien vers l'article du blog

Manipuler les fichiers en python est très simple :


  • Pour ouvrir un fichier en mode lecture : fichier=open("nomDuFichier.txt", "r")
  • Pour lire dans le fichier: contenu=fichier.read() OU contenu=fichier.readlines()
  • Pour ouvrir un fichier en mode écriture : fichier=open("nomDuFichier.txt", "w")

(où "r" et "w" indique la mode d'ouverture (read/write))


Ouvrir un flux vers une page internet peut être aussi simple. Après avoir ajouté la bibliothèque urllib (import urllib), un flux peut être ouvert de la façon suivante :


flux=urllib.urlopen("http://www.nomDuSite.com") contenuFlux=flux.read() flux.close()


Ensuite, a priori, il suffit d’ouvrir un nouveau fichier pour stocker la page aspirée et écrire le contenu dedans :


pageAspiree=open("pageaspiree1.html", "w") print>>pageAspiree, contenuFlux pageAspiree.close()


Cependant, comme avec le programme en Bash (spécifiquement avec les commandes « wget » et « curl »), des problèmes d’aspiration des pages nous ont forcées à vérifier l’aspiration et à traiter les éventuelles erreurs.

Récupérer le code http de la commande urlopen() permet de traiter les erreurs http et ainsi trier les pages non-aspirées. Nous ne pouvons pas continuer à travailler sur ces pages-là si le contenu n’est pas aspiré, donc c’est une étape très importante.


codehttp = flux.getcode()


Un code http indiquant la réussite de l’aspiration est 200. Un code http autre que 200 indique qu’un problème a empêché l’aspiration.

Le problème est que certaines URLs prennent plus de temps à être aspirées – et ceci peut bloquer tout le programme pendant un certain temps. Il est nécessaire de limiter le temps d’attente pour ne pas bloquer l’avancement du programme, ce qui est possible avec URLlib2 :


flux=urllib2.urlopen(ligne , timeout=60)


Ici le temps maximum d'attente est 60 seconds. Au-delà de 60 seconds, nous passons à l'URL suivante.

URLlib2 a une manière plus sophistiquée de traiter les exceptions. Tandis que la réponse de urllib est de produire la page avec un message d'erreur et puis d'utiliser ce message d'erreur, urllib2 traite automatiquement l'exception en renvoyant à l'écran le message d'erreur, ce qui arrête le programme.

Il est nécessaire avec URllib2 d’anticiper ces erreurs pour que le programme continue malgré qu’une page ne soit pas aspirée.

URLerreur="-" httperreur="-" print u">>>URL numéro %d, dossier %s >>> "%(i, title), try: flux = urllib2.urlopen(ligne, timeout=1) except socket.timeout as socketErreur: print "\rURLErreur >>> %s" %(socketErreur) print>>fichierin, "Page non aspirée" print>>fichierin, " socket timeout" i+=1 continue except urllib2.HTTPError as httperreur: print "Erreur http >>> %s" %(httperreur) print>>fichierin, "Page non aspirée" print>>fichierin, "%s" %(httperreur) i+=1 continue except urllib2.URLError as URLerreur: print "\rURLErreur >>> %s" %(URLerreur.reason) print>>fichierin, "Page non aspirée" print>>fichierin, "%s" %(URLerreur.reason) i+=1 continue else: codehttp = flux.getcode() print u"début de l'aspiration >>>", try : contenuhtml = flux.read() except socket.timeout as socketErreur: flux.close() print "URLErreur >>> %s" %(socketErreur) print>>fichierin, "Page non aspirée" print>>fichierin, " socket timeout" else : flux.close() print "done ! - http code : %s" %(codehttp) pageaspiree=open("./PAGES-ASPIREES/"+filename+"/page"+str(i)+".html", "w" ) print>>pageaspiree, contenuhtml pageaspiree.close() print>>fichierin, "< a href=\"../PAGES-ASPIREES/"+filename +"/page" + str(i) +".html\">page "+str(i)+"< /a>" i+=1
Extraction du contenu textuel (dump en texte-brut)
Lien vers l'article du blog -> L'encodage et l'extraction du contenu textuel

Lien vers l'article du blog -> Deuxième essai

Le module nltk fournit une commande pour nettoyer du html afin d'extraire uniquement le contenu textuel :

dumptext = nltk.clean_html(contenuhtml)


Si l'encodage est de l'utf-8, cette étape peut être effectuée immédiatement pour faire un dump du texte brut en utf-8. Travaillant dans un environnement Unicode, il est nécessaire de faire un dump initial avant de convertir ces pages de leur encodage original en utf-8. Dans tous les cas, il est d'abord nécessaire de détecter l'encodage :


Détection d'encodage
Lien vers l'article du blog -> L'encodage et l'extraction du contenu textuel

Lien vers l'article du blog -> Deuxième essai

C'est une des étapes les plus difficiles en raison de la difficulté de détecter de manière automatique un encodage à partir du texte. Nous avons vu dans le programme en Bash que la commande « file -i » permettait de détecter l'encodage d'un fichier. Ce n'est pas fiable à 100%, ce qui n'est pas étonnant, et la commande renvoyait souvent le résultat « unknown 8-bit » quand elle n'arrivait pas à deviner l'encodage. Dans le cas où « file » ne détectait pas d'encodage, il était nécessaire de faire un deuxième niveau de détection d'encodage, en cherchant dans le code source de la page, en extrayant le codage de la balise <meta charset..>.

En python il existe « chardet », qui renvoie l'encodage du fichier donné et le degré de certitude associé à cette détection d'encodage. Elle est plus intéressante que « file » car elle renvoie aussi un degré d'assurance qui n'est pas fournie par « file ». Le résultat est renvoyé sous forme d'un dictionnaire :


chardet

A première vue, « chardet » semble bien fonctionner. Elle fournit un encodage (ou au moins une estimation éclairée de l'encodage) dans TOUS les cas, contrairement à « file » qui renvoie souvent la réponse « unknown 8-bit ».

Pourtant, le fait que « chardet » renvoie toujours un résultat provoque encore plus de problèmes, car nous ne pouvons pas nous fier à ce qui est renvoyé, même avec le niveau d'assurance. Notamment les encodages Windows-1253 et Latin-1, utilisés respectivement pour le grec et le français n'appartiennent pas à la liste d'encodages reconnus par « chardet ».

En se tournant vers la bibliothèque BeautifulSoup, nous avons essayé ensuite le module UnicodeDammit, qui prend comme argument le texte et une liste d'encodages possibles, qui aide UnicodeDammit à correctement détecter l'encodage :

newContent=UnicodeDammit(plaintext,[encodage] ) text= newContent.unicode_markupdump textutf8=text.encode('utf-8')

Sans cette liste d'encodages possibles, UnicodeDammit rencontre aussi des problèmes dans la détection d'encodage. Une solution serait d'inverser les deux étapes de la détection d'encodage afin de fournir à UnicodeDammit un encodage possible.

Le module « re » permet d'extraire le codage en utilisant une expression régulière :

encodage=re.findall(r'< ?meta.*charset.*?/?>', contenuhtml) encodage= re.findall(r'charset ?= ?[^/>]*', encodage[0]) encodage=encodage[0].split("=") encodage= (re.findall(r'[\w-]+[^ \"\']', encodage[1]))

Extraction des contextes

Lien vers l'article du blog

L'extraction des contextes contenants notre motif nécessite l'utilisation des expressions régulières. Nous avons déjà vu que c'est possible avec le module python "re". Pour extraire les mots associés à l'américanisation, nous avons utilisé le même motif utilisé en Bash :


Cependant, l'extraction de toute une ligne de texte dans laquelle se trouve le motif, en utilisant les métacaractères ^ (début de ligne) et $ (fin de ligne), était problématique. Une ligne de texte contenait tout un paragraphe, ce qui faisait que l'extraction des contextes n'était pas assez pertinente, car presque tout le texte était renvoyé. Il fallait trouver une expression qui renvoyait un certain nombre de mots avant et après le mot recherché :


expr = re.compile(ur"(?:([^\t\n]{,150})((am.ricani[sz].*?\W)|(\W[Aα]μερικανοπο[ίι].*?\W)|(εξαμερ[ίι]καν[ίι]σ.*?\W)|(\W[Aα]μερικανισμός))([^\t\n]{,150}\W))", re.I)

Le flag 're.I' indique que les différences de casses sont ignorées dans l'expression. Nous voulons extraire le contexte immédiat de chaque côté du mot extrait. Donc l'expression va chercher jusqu'à 150 caractères qui précèdent et 150 caractères qui suivent le mot, à condition que la phrase extraite ne contienne que des mots complets.

Les caractères non-ASCII étant encodés sur plusieurs octets, il était d'abord nécessaire de décoder le texte avant d'extraire les contextes :


utf8Extraction

texte=texte.decode("utf-8")


pour ensuite recoder le texte en utf-8 avant d'écrire dans le fichier:


texte=texte.encode("utf-8")


Une fois les contextes écrits dans un fichier pour chaque URL et dans un fichier global pour chaque langue, nous procédons à la dernière étape : l'ajout du programme Perl « minigrep » et le comptage du nombre d'occurrences du mot en utilisant len() sur le résultat de re.findall().



Le Script

[ Haut de la page ]

Pour télécharger le script cliquez ici !


1 #!/usr/bin/python 2 #!-*-coding:utf8-*- 3 import urllib 4 import urllib2 5 import os 6 import socket 7 import nltk 8 from bs4 import UnicodeDammit 9 import re 10 11 dos=raw_input("Donnez le nom du dossier contenant les fichiers url : ") 12 tableau=raw_input("Donnez le nom du fichier html ou stocker ces liens : ") 13 14 #Commencer a ecrire dans le tableau (ouverture des balises html et body) 15 fichierin =open(tableau, "w") 16 fichierin.write("<html><head><link rel=\"stylesheet\" href=\"style.css\"/><meta charset=\"utf-8\" /><title>Americanisation</title></head><body>") 17 18 19 #creation d'un dossier pour les fichiers globaux s'il n'existe pas deja 20 if not os.path.exists("./FICHIERSGLOBAUX"): 21 os.mkdir("./FICHIERSGLOBAUX") 22 23 j=1 #variable pour compter les tableaux 24 25 26 27 #------Lire le contenu du dossier et traiter chaque fichier URL------# 28 29 for filename in (os.listdir(dos)): 30 31 #ouvrir le fichier url 32 fichierout=open("%s/%s"%(dos,filename), "r") 33 34 #-------Création des noms de sous-dossiers------# 35 36 (filename, extension) = os.path.splitext(filename) 37 38 39 #----------Création de sous-dossiers------------# 40 41 if not os.path.exists("./PAGES-ASPIREES/"+filename): 42 os.mkdir("./PAGES-ASPIREES/"+filename) 43 44 if not os.path.exists("./DUMP-TEXT/"+filename): 45 os.mkdir("./DUMP-TEXT/"+filename) 46 47 if not os.path.exists("./CONTEXTES/"+filename): 48 os.mkdir("./CONTEXTES/"+filename) 49 50 if not os.path.exists("./FICHIERSGLOBAUX/"+filename): 51 os.mkdir("./FICHIERSGLOBAUX/"+filename) 52 53 54 #-----creation du titre du tableau------# 55 56 title = filename.replace ("_", " ") 57 58 #----Commencer a ecrire le tableau, et ses headers----# 59 60 print>>fichierin, "<table><tr><th colspan=\"9\">Tableau numero",j, "(",title,") :</th></tr>" 61 print>>fichierin, "<tr><th class=\"short\">No.</th><th>Lien</th><th>Page aspirée</th><th>Erreur</th><th>DUMP</th><th>DUMP UTF-8</th><th>Contextes</th><th>Contextes Html</th><th class=\"short\">Nbr Occs</th></tr>" 62 63 j+=1 64 i=1 #compteur pour les URLs 65 countglobal=0 #compteur pour le nombre de fichiers dans les fichiers globaux 66 67 68 #--------Lire le contenu du fichier URL et traiter chaque URL --------# 69 70 for ligne in (fichierout.readlines()): 71 72 print>>fichierin, "<tr><td>",i,"</td><td><a href=\"",ligne,"\">URL",i,"</a></td>" # 2 premieres colonnes 73 74 75 #------Aspiration de la page -----# 76 77 URLerreur="-" 78 httperreur="-" 79 80 print u">>>URL numéro %d, dossier %s >>> "%(i, title), 81 82 try: 83 flux = urllib2.urlopen(ligne, timeout=20) #tenter d'ouvrir le flux 84 85 86 #--------Gestion des erreurs ---------# 87 88 except socket.timeout as socketErreur: 89 print "\rURLErreur >>> %s" %(socketErreur) 90 print>>fichierin, "<td class=\"erreur\">Page non aspirée</td>" 91 print>>fichierin, "<td class=\"erreur\"> socket timeout</td>" 92 print>>fichierin, "<td class=\"erreur\"> -</td>" 93 print>>fichierin, "<td class=\"erreur\"> -</td>" 94 print>>fichierin, "<td class=\"erreur\"> -</td>" 95 print>>fichierin, "<td class=\"erreur\"> -</td>" 96 print>>fichierin, "<td class=\"erreur\">-</td></tr>" 97 98 i+=1 99 continue 100 101 except urllib2.HTTPError as httperreur: 102 103 print "Erreur http >>> %s" %(httperreur) 104 print>>fichierin, "<td class=\"erreur\">Page non aspirée</td>" 105 print>>fichierin, "<td class=\"erreur\">%s</td>" %(httperreur) 106 print>>fichierin, "<td class=\"erreur\"> -</td>" 107 print>>fichierin, "<td class=\"erreur\"> -</td>" 108 print>>fichierin, "<td class=\"erreur\"> -</td>" 109 print>>fichierin, "<td class=\"erreur\"> -</td>" 110 print>>fichierin, "<td class=\"erreur\"> -</td></tr>" 111 112 i+=1 113 continue 114 115 except ValueError as valueError: 116 117 print "Erreur http >>> %s" %(valueError) 118 print>>fichierin, "<td class=\"erreur\">Page non aspirée</td>" 119 print>>fichierin, "<td class=\"erreur\">%s</td>" %(valueError) 120 print>>fichierin, "<td class=\"erreur\"> -</td>" 121 print>>fichierin, "<td class=\"erreur\"> -</td>" 122 print>>fichierin, "<td class=\"erreur\"> -</td>" 123 print>>fichierin, "<td class=\"erreur\"> -</td>" 124 print>>fichierin, "<td class=\"erreur\"> -</td></tr>" 125 126 i+=1 127 continue 128 129 except urllib2.URLError as URLerreur: 130 print "\rURLErreur >>> %s" %(URLerreur.reason) 131 print>>fichierin, "<td class=\"erreur\">Page non aspirée</td>" 132 print>>fichierin, "<td class=\"erreur\">%s</td>" %(URLerreur.reason) 133 print>>fichierin, "<td class=\"erreur\"> -</td>" 134 print>>fichierin, "<td class=\"erreur\"> -</td>" 135 print>>fichierin, "<td class=\"erreur\"> -</td>" 136 print>>fichierin, "<td class=\"erreur\"> -</td>" 137 print>>fichierin, "<td class=\"erreur\"> -</td></tr>" 138 139 i+=1 140 continue 141 142 143 #------Si le flux est ouvert-------# 144 145 else: 146 codehttp = flux.getcode() 147 print u"début de l'aspiration >>>", 148 try : 149 contenuhtml = flux.read() #lire le contenu 150 151 152 #--------Gestion des erreurs-------# 153 154 except socket.timeout as socketErreur: 155 flux.close() 156 print "\rURLErreur >>> %s" %(socketErreur) 157 print>>fichierin, "<td class=\"erreur\">Page non aspirée</td>" 158 print>>fichierin, "<td class=\"erreur\"> socket timeout</td>" 159 print>>fichierin, "<td class=\"erreur\"> -</td>" 160 print>>fichierin, "<td class=\"erreur\"> -</td>" 161 print>>fichierin, "<td class=\"erreur\"> -</td>" 162 print>>fichierin, "<td class=\"erreur\"> -</td>" 163 print>>fichierin, "<td class=\"erreur\"> -</td></tr>" 164 165 166 #--------S'il n'y a pas d'erreurs-------# 167 168 else: 169 170 flux.close() #fermeture de flux 171 172 print "done ! - http code : %s" %(codehttp) 173 174 175 pageaspiree=open("./PAGES-ASPIREES/"+filename+"/page"+str(i)+".html", "w" ) #ecrire le contenu de la page aspiree 176 print>>pageaspiree, contenuhtml 177 pageaspiree.close() 178 179 #3eme et 4eme colonnes 180 print>>fichierin, "<td><a href=\"../PAGES-ASPIREES/"+filename+"/page"+str(i)+".html\">page "+str(i)+"</a></td>" 181 print>>fichierin, "<td>%d</td>" %(codehttp) 182 183 184 #----------Detection d'encodage --------# 185 186 encodage="" 187 188 #-----Detection d'encodage dans le code source -------# 189 190 if re.findall(r'< ?meta.*charset.*?/?>', contenuhtml): 191 encodage=re.findall(r'< ?meta.*charset.*?/?>', contenuhtml) 192 encodage= re.findall(r'charset ?= ?[^/>]*', encodage[0]) 193 encodage=encodage[0].split("=") 194 encodage= (re.findall(r'[\w-]+[^ \"\']', encodage[1]))[-1] 195 196 197 #---------Si l'encodage et de l'utf-8---------# 198 199 if encodage=="utf-8" or encodage=="UTF-8": 200 201 dumptextutf8 = nltk.clean_html(contenuhtml) 202 203 dumptext=open("./DUMP-TEXT/"+filename+"/page"+str(i)+"utf8.txt", "w" ) 204 print>>dumptext, dumptextutf8 205 dumptext.close() 206 207 #5eme et 6eme colonnes 208 print>>fichierin, "<td> --> </td>" 209 print>>fichierin, "<td><a href=\"../DUMP-TEXT/"+filename+"/page"+str(i)+"utf8.txt\">page "+str(i)+"</a></td>" 210 211 else: 212 213 214 #--------Dump plain text (intial)-------# 215 216 217 plaintext = nltk.clean_html(contenuhtml) 218 219 dumptext=open("./DUMP-TEXT/"+filename+"/page"+str(i)+".txt", "w" ) 220 print>>dumptext, plaintext 221 dumptext.close() 222 223 224 225 #-------Conversion en utf-8-------# 226 227 newContent=UnicodeDammit(plaintext,[encodage, "windows-1256", "iso-8859-7"] ) 228 text= newContent.unicode_markup 229 dumptextutf8=text.encode('utf-8') 230 231 dumptext=open("./DUMP-TEXT/"+filename+"/page"+str(i)+"utf8.txt", "w") 232 print>>dumptext, dumptextutf8 233 dumptext.close() 234 235 #5eme colonnes 236 print>>fichierin,"<td><a href=\"../DUMP-TEXT/"+filename+"/page"+str(i)+".txt\">" 237 238 if encodage=="": 239 print>>fichierin,"BS4: "+newContent.original_encoding+"</a></td>"#6eme colonne 240 else: 241 print>>fichierin,encodage+"</a></td>" 242 print>>fichierin, "<td><a href=\"../DUMP-TEXT/"+filename+"/page"+str(i)+"utf8.txt\">page "+str(i)+"</a></td>"#7eme colonne 243 244 245 #-------Extraction des contextes---------# 246 247 fichierdmp=open("./DUMP-TEXT/"+filename+"/page"+str(i)+"utf8.txt", "r") 248 conx=fichierdmp.read() 249 fichierdmp.close() 250 251 252 conx=conx.decode("utf-8",errors="ignore") #decoder le texte 253 conx=conx.replace("#","") #supprimer les croisillons 254 255 expr = re.compile(ur"(?:([^\t\n]{,150})(([Aa]m.ricani[sz].*?\W)|(\W[Aα]μερικανοπο[ίι].*?\W)|(εξαμερ[ίι]καν[ίι]σ.*?\W)|(\W[Aα]μερικανισμός))([^\t\n]{,150}\W))", re.I) #motif pour les contextes 256 257 res=re.findall(expr,conx)#chercher les contextes selon le motif ci-dessus 258 259 fichiercontextes=open("./CONTEXTES/"+filename+"/page"+str(i)+".txt", "w") 260 261 #ecrire les contextes dans le fichier contextes.txt 262 for found in res: 263 print>>fichiercontextes, found[0].encode("utf-8")+found[1].encode("utf-8")+found[6].encode("utf-8")+"#" 264 265 fichiercontextes.close() 266 267 print>>fichierin, "<td><a href=\"../CONTEXTES/"+filename+"/page"+str(i)+".txt\">page "+str(i)+"</a></td>" 268 269 #--------Contextes html--------# 270 271 272 os.system("perl ./PROGRAMMES/minigrepMultilingue2/minigrepmultilingue.pl UTF-8 ./DUMP-TEXT/"+filename+"/page"+str(i)+"utf8.txt ./PROGRAMMES/minigrepMultilingue2/motif.txt") 273 os.rename("resultat-extraction.html", "./CONTEXTES/"+filename+"/page"+str(i)+"utf8.html") 274 275 print>>fichierin, "<td><a href=\"../CONTEXTES/"+filename+"/page"+str(i)+"utf8.html\">page "+str(i)+"</a></td>" 276 277 278 #-------Nombre d'occurrences------# 279 280 nboccs=0 281 282 nboccs=len(re.findall(ur"(\W[Aα]μερικανισμός\W)|(\W[Aa]m.ricani[sz].*?\W)|(\Wεξαμερ[ίι]καν[ίι]σ.*?\W)|(?:\W[Aα]μερικανοπο[ίι].*?\W)",conx, re.I)) 283 284 print>>fichierin, "<td>"+str(nboccs)+"</td></tr>" 285 286 287 #---------Dump Global--------# 288 289 acopier=open("./DUMP-TEXT/"+filename+"/page"+str(i)+"utf8.txt", "r") 290 pourDG=acopier.read() 291 acopier.close() 292 293 294 dumpsglobaux=open("./FICHIERSGLOBAUX/"+filename+"/DumpsGlobauxPYTHON.txt", "a") 295 dumpsglobaux.write(pourDG) 296 dumpsglobaux.close() 297 298 if pourDG!="": 299 countglobal+=1 300 301 302 #-------Contextes Globaux------# 303 304 acopier=open("./CONTEXTES/"+filename+"/page"+str(i)+".txt", "r") 305 pourCG=acopier.read() 306 acopier.close() 307 308 309 contextesglobaux=open("./FICHIERSGLOBAUX/"+filename+"/ContextesGlobauxPYTHON.txt", "a") 310 contextesglobaux.write(str(pourCG)) 311 contextesglobaux.close() 312 313 314 315 i+=1 316 317 fichierout.close() 318 319 #------FIN de la boucle : lire le contenu du fichier URL-----# 320 321 322 print>>fichierin, "<tr class=\"final\"><td></td><td></td><td></td><td></td><td></td>" 323 print>>fichierin, "<td class=\"finalglob\"><a href=\"../FICHIERSGLOBAUX/"+filename+"/DumpsGlobauxPYTHON.txt\">Dump Global("+str(countglobal)+")</a></td>" 324 print>>fichierin, "<td class=\"finalglob\"><a href=\"../FICHIERSGLOBAUX/"+filename+"/ContextesGlobauxPYTHON.txt\">Contextes Globaux("+str(countglobal)+")</a></td><td></td><td></td></tr>" 325 326 print>>fichierin,"</table><br><br>" 327 328 329 330 #refermer les balises ouvertes au début du fichierin.html 331 print>>fichierin, "</body></html>" 332 333 fichierin.close() 334 335 336

Tableaux

[ Haut de la page ]
Tableau numero 1 ( Anglais Britannique ) :
No.LienPage aspiréeErreurDUMPDUMP UTF-8ContextesContextes HtmlNbr Occs
1 URL 1 page 1 200 --> page 1 page 1 page 1 7
2 URL 2 page 2 200 --> page 2 page 2 page 2 0
3 URL 3 page 3 200 --> page 3 page 3 page 3 9
4 URL 4 page 4 200 --> page 4 page 4 page 4 3
5 URL 5 page 5 200 iso-8859-1 page 5 page 5 page 5 9
6 URL 6 page 6 200 iso-8859-1 page 6 page 6 page 6 12
7 URL 7 page 7 200 iso-8859-1 page 7 page 7 page 7 4
8 URL 8 page 8 200 iso-8859-1 page 8 page 8 page 8 1
9 URL 9 page 9 200 iso-8859-1 page 9 page 9 page 9 4
10 URL 10 page 10 200 iso-8859-1 page 10 page 10 page 10 1
11 URL 11 page 11 200 BS4: windows-1256 page 11 page 11 page 11 1
12 URL 12 page 12 200 iso-8859-1 page 12 page 12 page 12 0
13 URL 13 page 13 200 iso-8859-1 page 13 page 13 page 13 9
14 URL 14 page 14 200 --> page 14 page 14 page 14 5
15 URL 15 page 15 200 --> page 15 page 15 page 15 4
16 URL 16 page 16 200 --> page 16 page 16 page 16 6
17 URL 17 page 17 200 --> page 17 page 17 page 17 11
18 URL 18 page 18 200 --> page 18 page 18 page 18 0
19 URL 19 page 19 200 --> page 19 page 19 page 19 5
20 URL 20 page 20 200 --> page 20 page 20 page 20 1
21 URL 21 page 21 200 iso-8859-1 page 21 page 21 page 21 6
22 URL 22 page 22 200 iso-8859-1 page 22 page 22 page 22 2
23 URL 23 page 23 200 iso-8859-1 page 23 page 23 page 23 1
24 URL 24 Page non aspirée HTTP Error 403: Bad Behavior - - - - -
25 URL 25 page 25 200 --> page 25 page 25 page 25 0
26 URL 26 page 26 200 --> page 26 page 26 page 26 2
27 URL 27 page 27 200 --> page 27 page 27 page 27 1
28 URL 28 page 28 200 --> page 28 page 28 page 28 2
29 URL 29 page 29 200 --> page 29 page 29 page 29 5
30 URL 30 page 30 200 --> page 30 page 30 page 30 5
31 URL 31 page 31 200 --> page 31 page 31 page 31 2
32 URL 32 page 32 200 --> page 32 page 32 page 32 4
33 URL 33 page 33 200 --> page 33 page 33 page 33 0
34 URL 34 page 34 200 --> page 34 page 34 page 34 4
35 URL 35 page 35 200 --> page 35 page 35 page 35 2
36 URL 36 page 36 200 --> page 36 page 36 page 36 1
37 URL 37 page 37 200 --> page 37 page 37 page 37 3
38 URL 38 page 38 200 --> page 38 page 38 page 38 1
39 URL 39 page 39 200 --> page 39 page 39 page 39 1
40 URL 40 page 40 200 --> page 40 page 40 page 40 2
41 URL 41 page 41 200 --> page 41 page 41 page 41 6
42 URL 42 page 42 200 --> page 42 page 42 page 42 0
43 URL 43 page 43 200 --> page 43 page 43 page 43 0
44 URL 44 page 44 200 --> page 44 page 44 page 44 2
45 URL 45 page 45 200 --> page 45 page 45 page 45 5
46 URL 46 page 46 200 --> page 46 page 46 page 46 0
47 URL 47 page 47 200 --> page 47 page 47 page 47 4
48 URL 48 page 48 200 --> page 48 page 48 page 48 3
49 URL 49 page 49 200 --> page 49 page 49 page 49 9
50 URL 50 page 50 200 --> page 50 page 50 page 50 2
51 URL 51 page 51 200 --> page 51 page 51 page 51 4
52 URL 52 page 52 200 --> page 52 page 52 page 52 3
53 URL 53 page 53 200 --> page 53 page 53 page 53 10
54 URL 54 Page non aspirée HTTP Error 404: Not Found - - - - -
55 URL 55 page 55 200 --> page 55 page 55 page 55 7
56 URL 56 page 56 200 --> page 56 page 56 page 56 1
57 URL 57 Page non aspirée HTTP Error 404: Not Found - - - - -
58 URL 58 page 58 200 --> page 58 page 58 page 58 3
59 URL 59 page 59 200 --> page 59 page 59 page 59 2
60 URL 60 page 60 200 --> page 60 page 60 page 60 6
61 URL 61 page 61 200 --> page 61 page 61 page 61 4
62 URL 62 page 62 200 --> page 62 page 62 page 62 7
63 URL 63 page 63 200 --> page 63 page 63 page 63 1
Dump Global(60) Contextes Globaux(60)


Tableau numero 2 ( Grec ) :
No.LienPage aspiréeErreurDUMPDUMP UTF-8ContextesContextes HtmlNbr Occs
1 URL 1 page 1 200 windows-1253 page 1 page 1 page 1 1
2 URL 2 page 2 200 windows-1253 page 2 page 2 page 2 1
3 URL 3 page 3 200 windows-1253 page 3 page 3 page 3 1
4 URL 4 page 4 200 windows-1253 page 4 page 4 page 4 1
5 URL 5 page 5 200 windows-1253 page 5 page 5 page 5 1
6 URL 6 page 6 200 windows-1253 page 6 page 6 page 6 1
7 URL 7 page 7 200 windows-1253 page 7 page 7 page 7 0
8 URL 8 page 8 200 windows-1253 page 8 page 8 page 8 2
9 URL 9 page 9 200 windows-1253 page 9 page 9 page 9 3
10 URL 10 page 10 200 windows-1253 page 10 page 10 page 10 1
11 URL 11 page 11 200 windows-1253 page 11 page 11 page 11 1
12 URL 12 page 12 200 --> page 12 page 12 page 12 2
13 URL 13 page 13 200 --> page 13 page 13 page 13 0
14 URL 14 page 14 200 --> page 14 page 14 page 14 1
15 URL 15 page 15 200 --> page 15 page 15 page 15 1
16 URL 16 page 16 200 --> page 16 page 16 page 16 1
17 URL 17 page 17 200 --> page 17 page 17 page 17 1
18 URL 18 page 18 200 --> page 18 page 18 page 18 1
19 URL 19 page 19 200 --> page 19 page 19 page 19 0
20 URL 20 page 20 200 --> page 20 page 20 page 20 0
21 URL 21 page 21 200 --> page 21 page 21 page 21 1
22 URL 22 page 22 200 --> page 22 page 22 page 22 1
23 URL 23 page 23 200 --> page 23 page 23 page 23 1
24 URL 24 page 24 200 --> page 24 page 24 page 24 1
25 URL 25 page 25 200 --> page 25 page 25 page 25 1
26 URL 26 page 26 200 --> page 26 page 26 page 26 2
27 URL 27 page 27 200 --> page 27 page 27 page 27 1
28 URL 28 page 28 200 ISO-8859-7 page 28 page 28 page 28 1
29 URL 29 page 29 200 ISO-8859-7 page 29 page 29 page 29 2
30 URL 30 page 30 200 ISO-8859-7 page 30 page 30 page 30 1
31 URL 31 page 31 200 ISO-8859-7 page 31 page 31 page 31 1
32 URL 32 page 32 200 ISO-8859-7 page 32 page 32 page 32 1
33 URL 33 page 33 200 ISO-8859-7 page 33 page 33 page 33 1
34 URL 34 page 34 200 ISO-8859-7 page 34 page 34 page 34 1
35 URL 35 page 35 200 --> page 35 page 35 page 35 1
36 URL 36 page 36 200 --> page 36 page 36 page 36 1
37 URL 37 page 37 200 --> page 37 page 37 page 37 1
38 URL 38 page 38 200 --> page 38 page 38 page 38 0
39 URL 39 page 39 200 --> page 39 page 39 page 39 4
40 URL 40 page 40 200 --> page 40 page 40 page 40 4
41 URL 41 page 41 200 --> page 41 page 41 page 41 4
42 URL 42 page 42 200 --> page 42 page 42 page 42 3
43 URL 43 page 43 200 --> page 43 page 43 page 43 3
44 URL 44 page 44 200 --> page 44 page 44 page 44 1
45 URL 45 page 45 200 --> page 45 page 45 page 45 2
46 URL 46 page 46 200 --> page 46 page 46 page 46 1
47 URL 47 page 47 200 --> page 47 page 47 page 47 1
48 URL 48 page 48 200 --> page 48 page 48 page 48 1
49 URL 49 page 49 200 --> page 49 page 49 page 49 1
50 URL 50 page 50 200 --> page 50 page 50 page 50 2
51 URL 51 page 51 200 --> page 51 page 51 page 51 2
52 URL 52 page 52 200 BS4: windows-1256 page 52 page 52 page 52 0
53 URL 53 page 53 200 windows-1253 page 53 page 53 page 53 1
54 URL 54 page 54 200 windows-1253 page 54 page 54 page 54 1
Dump Global(54) Contextes Globaux(54)


Tableau numero 3 ( Francais ) :
No.LienPage aspiréeErreurDUMPDUMP UTF-8ContextesContextes HtmlNbr Occs
1 URL 1 page 1 200 --> page 1 page 1 page 1 3
2 URL 2 page 2 200 iso-8859-1 page 2 page 2 page 2 1
3 URL 3 page 3 200 iso-8859-1 page 3 page 3 page 3 1
4 URL 4 page 4 200 iso-8859-1 page 4 page 4 page 4 2
5 URL 5 page 5 200 iso-8859-1 page 5 page 5 page 5 1
6 URL 6 page 6 200 iso-8859-1 page 6 page 6 page 6 4
7 URL 7 page 7 200 iso-8859-1 page 7 page 7 page 7 1
8 URL 8 page 8 200 --> page 8 page 8 page 8 2
9 URL 9 page 9 200 --> page 9 page 9 page 9 4
10 URL 10 page 10 200 --> page 10 page 10 page 10 2
11 URL 11 page 11 200 --> page 11 page 11 page 11 2
12 URL 12 page 12 200 --> page 12 page 12 page 12 2
13 URL 13 page 13 200 --> page 13 page 13 page 13 2
14 URL 14 page 14 200 --> page 14 page 14 page 14 1
15 URL 15 page 15 200 iso-8859-1 page 15 page 15 page 15 3
16 URL 16 page 16 200 iso-8859-1 page 16 page 16 page 16 1
17 URL 17 page 17 200 iso-8859-1 page 17 page 17 page 17 2
18 URL 18 page 18 200 iso-8859-1 page 18 page 18 page 18 2
19 URL 19 page 19 200 iso-8859-1 page 19 page 19 page 19 2
20 URL 20 page 20 200 iso-8859-1 page 20 page 20 page 20 2
21 URL 21 page 21 200 --> page 21 page 21 page 21 1
22 URL 22 page 22 200 --> page 22 page 22 page 22 1
23 URL 23 page 23 200 iso-8859-1 page 23 page 23 page 23 1
24 URL 24 page 24 200 --> page 24 page 24 page 24 8
25 URL 25 page 25 200 iso-8859-1 page 25 page 25 page 25 9
26 URL 26 page 26 200 iso-8859-1 page 26 page 26 page 26 1
27 URL 27 page 27 200 iso-8859-1 page 27 page 27 page 27 1
28 URL 28 page 28 200 iso-8859-1 page 28 page 28 page 28 1
29 URL 29 page 29 200 iso-8859-1 page 29 page 29 page 29 4
30 URL 30 page 30 200 iso-8859-1 page 30 page 30 page 30 9
31 URL 31 page 31 200 iso-8859-1 page 31 page 31 page 31 5
32 URL 32 page 32 200 --> page 32 page 32 page 32 6
33 URL 33 page 33 200 --> page 33 page 33 page 33 20
34 URL 34 page 34 200 iso-8859-1 page 34 page 34 page 34 1
35 URL 35 page 35 200 iso-8859-1 page 35 page 35 page 35 2
36 URL 36 page 36 200 --> page 36 page 36 page 36 4
37 URL 37 page 37 200 --> page 37 page 37 page 37 2
38 URL 38 page 38 200 --> page 38 page 38 page 38 4
39 URL 39 page 39 200 --> page 39 page 39 page 39 3
40 URL 40 page 40 200 --> page 40 page 40 page 40 4
41 URL 41 page 41 200 --> page 41 page 41 page 41 3
42 URL 42 page 42 200 --> page 42 page 42 page 42 3
43 URL 43 page 43 200 --> page 43 page 43 page 43 0
44 URL 44 page 44 200 --> page 44 page 44 page 44 4
45 URL 45 page 45 200 --> page 45 page 45 page 45 2
46 URL 46 page 46 200 --> page 46 page 46 page 46 2
47 URL 47 page 47 200 --> page 47 page 47 page 47 1
48 URL 48 page 48 200 --> page 48 page 48 page 48 1
49 URL 49 page 49 200 --> page 49 page 49 page 49 7
50 URL 50 page 50 200 --> page 50 page 50 page 50 1
51 URL 51 page 51 200 --> page 51 page 51 page 51 1
52 URL 52 page 52 200 --> page 52 page 52 page 52 7
53 URL 53 page 53 200 --> page 53 page 53 page 53 1
54 URL 54 page 54 200 --> page 54 page 54 page 54 4
55 URL 55 page 55 200 --> page 55 page 55 page 55 1
56 URL 56 page 56 200 --> page 56 page 56 page 56 1
57 URL 57 page 57 200 --> page 57 page 57 page 57 2
58 URL 58 page 58 200 iso-8859-1 page 58 page 58 page 58 1
Dump Global(58) Contextes Globaux(58)


Tableau numero 4 ( Anglais Americain ) :
No.LienPage aspiréeErreurDUMPDUMP UTF-8ContextesContextes HtmlNbr Occs
1 URL 1 page 1 200 --> page 1 page 1 page 1 3
2 URL 2 page 2 200 --> page 2 page 2 page 2 1
3 URL 3 page 3 200 --> page 3 page 3 page 3 1
4 URL 4 page 4 200 --> page 4 page 4 page 4 2
5 URL 5 Page non aspirée HTTP Error 404: Not Found - - - - -
6 URL 6 page 6 200 --> page 6 page 6 page 6 2
7 URL 7 page 7 200 --> page 7 page 7 page 7 8
8 URL 8 page 8 200 BS4: windows-1256 page 8 page 8 page 8 2
9 URL 9 page 9 200 --> page 9 page 9 page 9 1
10 URL 10 page 10 200 --> page 10 page 10 page 10 5
11 URL 11 page 11 200 --> page 11 page 11 page 11 1
12 URL 12 page 12 200 --> page 12 page 12 page 12 2
13 URL 13 page 13 200 --> page 13 page 13 page 13 1
14 URL 14 page 14 200 --> page 14 page 14 page 14 4
15 URL 15 page 15 200 --> page 15 page 15 page 15 1
16 URL 16 page 16 200 --> page 16 page 16 page 16 1
17 URL 17 page 17 200 --> page 17 page 17 page 17 5
18 URL 18 page 18 200 --> page 18 page 18 page 18 14
19 URL 19 page 19 200 --> page 19 page 19 page 19 1
20 URL 20 page 20 200 --> page 20 page 20 page 20 2
21 URL 21 page 21 200 --> page 21 page 21 page 21 3
22 URL 22 page 22 200 --> page 22 page 22 page 22 2
23 URL 23 page 23 200 --> page 23 page 23 page 23 1
24 URL 24 page 24 200 --> page 24 page 24 page 24 4
25 URL 25 page 25 200 --> page 25 page 25 page 25 2
26 URL 26 page 26 200 --> page 26 page 26 page 26 1
27 URL 27 page 27 200 --> page 27 page 27 page 27 7
28 URL 28 Page non aspirée HTTP Error 303 - - - - -
29 URL 29 Page non aspirée HTTP Error 303 - - - - -
30 URL 30 Page non aspirée HTTP Error 404: Not Found - - - - -
31 URL 31 page 31 200 BS4: windows-1256 page 31 page 31 page 31 3
32 URL 32 page 32 200 --> page 32 page 32 page 32 1
33 URL 33 page 33 200 --> page 33 page 33 page 33 1
34 URL 34 page 34 200 BS4: windows-1256 page 34 page 34 page 34 1
35 URL 35 page 35 200 --> page 35 page 35 page 35 1
36 URL 36 page 36 200 BS4: windows-1256 page 36 page 36 page 36 9
37 URL 37 page 37 200 --> page 37 page 37 page 37 2
38 URL 38 page 38 200 --> page 38 page 38 page 38 2
39 URL 39 page 39 200 --> page 39 page 39 page 39 2
40 URL 40 page 40 200 --> page 40 page 40 page 40 1
41 URL 41 page 41 200 --> page 41 page 41 page 41 3
42 URL 42 page 42 200 --> page 42 page 42 page 42 1
43 URL 43 page 43 200 --> page 43 page 43 page 43 2
44 URL 44 page 44 200 --> page 44 page 44 page 44 1
45 URL 45 page 45 200 --> page 45 page 45 page 45 1
46 URL 46 page 46 200 --> page 46 page 46 page 46 1
47 URL 47 page 47 200 --> page 47 page 47 page 47 1
48 URL 48 page 48 200 --> page 48 page 48 page 48 1
49 URL 49 page 49 200 --> page 49 page 49 page 49 1
50 URL 50 page 50 200 iso-8859-1 page 50 page 50 page 50 4
51 URL 51 page 51 200 --> page 51 page 51 page 51 8
52 URL 52 page 52 200 --> page 52 page 52 page 52 3
53 URL 53 page 53 200 BS4: windows-1256 page 53 page 53 page 53 5
54 URL 54 page 54 200 BS4: windows-1256 page 54 page 54 page 54 4
55 URL 55 page 55 200 BS4: windows-1256 page 55 page 55 page 55 3
Dump Global(51) Contextes Globaux(51)


Bilan

[ Haut de la page ]

Les problèmes:


Les avantages par rapport à Bash :


Les inconvénients par rapport à Bash :