Dans cette partie, il a fallu créer un script sous Python pour récupérer le code HTML d'une page web, le nettoyer de toutes ses balises et trouver le nombre de mots apparaissant dans cette page, ainsi que leur fréquence.

Voici l'ensemble du script python :



Télécharger le script Python

Explication du script ligne par ligne


#!/usr/bin/python#-*- coding: utf-8 -*-


  1. Récupération d'une page web

  • Importation du module : import urllib, re

On importe un module urllib : abréviation de "bibliothèque URL" pour intéragir avec internet et une 2ème librairie (re pour les expressions régulières)


La fonction urlopen permet de se connecter à internet et donc de se connecter avec la page web. On stocke le résultat dans une variable nommée url.

Nous avons choisi la page web http://www.festival-harpe.com/ car il s'agit d'une page en UTF-8, pour le vérifier, nous avons regardé le code source de la page (Ctrl U) et nous avons recherché le code, il s'agit bien d'une page en UTF-8.

        codehtml = url.read()

Cette nouvelle variable contient le code de la page web concernée.


  • Affichage du code source

        print codehtml

La fonction print permet d'afficher le contenu de la variable codehtml et donc le code de la page web.


  • Ouverture d'un fichier

        fichier1 = open ("pageweb.txt", "w")

Le fichier est ouvert en mode écriture : le fichier n'existait pas avant. Avec cette fonction il se créé au même emplacement que le script.


  1. Nettoyage du code source

        texte = re.sub("é","e",codehtml)
        texte = re.sub("é","e",codehtml)
        texte = re.sub("è","e",codehtml)
        texte = re.sub("ê","e",codehtml)
        texte = re.sub("î","i",codehtml)
        texte = re.sub("&agrave","a",codehtml)
        texte= re.sub("&acirc","a",codehtml)
        texte = re.sub("ocirc;","o",codehtml)
        texte = re.sub(" ","",codehtml)
        texte = re.sub("<.*?>","",codehtml)

Il s'agit d'une fonction qui permet de faire des substitutions dans les textes.
Il y a 3 arguments :
- pattern (= expression régulière, on cherche les motifs à retirer du code)
- repl (= chaîne de caractères qui va remplacer ce que l'on ne veut pas)
- string (= application de la procédure sur la chaine de caractères contenue dans la variable codehtml)

On nettoie le texte des balises html. On souhaite remplacer toutes les balises par rien.
"< .*?>", le point (.) signifie "n'importe quoi", l'étoile (*) signifie 0 ou n fois et le point d'interrogation (?) est l'opérateur glouton. L'espace vide (" ") remplacera la balise.


  1.   Ecriture du résultat dans le fichier ouvert en écriture

        fichier1.write(texte)

On écrit le résultat du code déjà nettoyé dans le fichier


Voir le résultat



  1. Comptage des mots et des caractères

  • Ouverture d'un fichier

        fichier2 = open ("infostat.txt", "w")

On ouvre un deuxième fichier en mode écriture pour écrire les résultats des statistiques trouvées.


  •  Ecriture des résultats

        fichier2.write("Ce fichier contient "+str(len(texte))+ " caractères.\n")

On écrit les résultats trouvés.
La fonction len() permet de calculer la longueur d'une liste (ex : nombre d'éléments)
La fonction str() prend en argument un entier et renvoie à une chaîne de caractères = pour écrire un résultat qui est un nombre entier.


  •  Coupure de mots

        expr = re.compile("\W+",re.U)

On enregistre le résultat de l'expression régulière dans une variable.
L'expression régulière /W permet de couper les mots. \W+ correspond à tout caractère non-alphanumérique qui apparaît une ou plusieurs fois.
On cherche donc des coupures où il y a 1 ou plus caractères non-alphanumériques

        liste = expr.split(texte)

"expr" contient tous les caractères non-alphanumériques que l'on veut couper.
On coupe donc le texte et on le range dans une liste.
Remarque : les mots séparés par des traits d'union ou des apostrophes vont aussi être coupés car il s'agit de symboles pris en compte par l'expression régulière /W. Ceci est une limite du nettoyage du texte.

        print liste

On imprime la liste de mots

         fichier2.write("Le fichier contient "+str(len(liste))+" mots.\n")

On écrit la liste de mots dans le fichier

         fichier2.write(" ".join(liste))

La fonction "join" est une fonction qui "joint" les éléments d'une liste avec le caractère qui précède, on colle les éléments.


  •  Comptage des mots différents

        fichier2.write("Le fichier contient "+str(len(liste))+" mots et "+str(len(set(liste)))+" mots différents.\n")

        fichier2.write(" ".join(set(liste)))

Une liste peut contenir plusieurs fois le même élément, la fonction "set" permet de ne retenir que les éléments uniques, elle fait un tri : chaque élément n'est là qu'une seule fois.

        fichier2.write(" ".join(sorted(set(liste))))

La fonction "sorted" permet de faire un tri alphabétique.

        fichier2.write(" ".join(sorted(set(liste),key=str.lower)))

On intervient sur la casse des caractères : on ajoute un deuxième argument (key=str.lower) à la fonction "sorted", on convertit tous les caractères en casse mineure. On arrive donc à un ensemble homogène trié alphabétiquement. : on aboutit à une liste de mots en minuscules triés par ordre alphabétique


  •  Fréquence des mots

        listeord = sorted(set(liste),key=str.lower)

On souhaite connaître la fréquence des mots, c'est-à-dire le nombre d'occurences d'un mot (nombre de fois qu'un mot apparaît)

        dicoFreq = {}

On créé un dictionnaire
Le but est d'associer un mot à son nombre d'occurences = tableau associatif, couple clés-valeurs. On incrémente la valeur de la fréquence du mot à chaque fois que ce mot est écrit dans le texte.
Incrémenter, c'est ajouter une valeur fixe dans le compteur

        for mot in listeord:

            if mot not in dicoFreq:

                dicoFreq[mot] = 1

Si le mot n'existe pas déjà dans le dictionnaire alors il prend une valeur de 1

            else: dicoFreq[mot] = dicoFreq[mot]+1

La boucle (if/else) permet de parcourir les mots : pour chaque mot on vérifie s'il existe déjà dans le texte; à chaque fois qu'on le rencontre, on augmente sa valeur de 1.

        for clef in sorted(dict.iterkeys(dicoFreq)):

            fichier2.write(clef +"\t" +str(dicoFreq[clef]) +"\n")

On trie la sortie du dicoFreq et on écrit le résultat dans le fichier.


  1.  Fermeture des fichiers

        fichier1.close()

        fichier2.close()

Tout fichier ouvert doit être fermé à la fin du programme.

Voir le résultat