Description générale du Script

Généralités

Ce script permet de générer un tableau contenant les données importantes de traitement pour les URLs. Il a été crée pour régler les problèmes liés au vietnamien : certains mots s'écrivent en deux. Il faut donc utiliser un tokenizer donné par les professeurs.
Contraitement au script de base, celui-ci prend 2 arguments :
- Le fichier d'URL
- Un tableau (que le script génère) qu'il faut nommer et dans lequel le traitement des données sera redirigé
L'expression régulière est directement incluse dans le script.



La sortie attendue

La sortie attendue de ce script est donc un tableau comprenant les informations suivantes pour chaque url:

- Un compteur indiquant le numéro de l'URL traitée
- Le code de retour indiquant le statut de la réponse (exemple: réussite, erreurs du serveur, erreurs du client)
- L'URL
- L'encodage de la page (qui devra être UTF-8 pour toutes les URLs)
- Le contenu de la page de l'URL sous le format html (.html)
- Le contenu de la page de l'URL sous le format texte (.txt)
- Le nombre d'occurrences du mot cible dans la page de l'URL
- Le contexte d'apparition, plus précisemment la ligne précédant et suivant le mot cible
- Le concordancier autour du mot cible (jusqu'à 5 mots)



Lancement du script

Pour lancer ce script, il faut se placer à la racine de la page et effectuer la commande suivante dans le terminal: (l'architecture de la page est celle conseillée dans la page d'exercice sur les URLS)
→ bash programmes/base_tableaux_fichier.sh ./URLs/urls-VN ./tableaux/tableau-Vietnamien.html"
Il n'y a pas besoin d'expression régulière puisqu'elle est inscrite dans le script.








Script dans son entièreté
#!/usr/bin/env bash
# -*- coding:utf-8 -*

fichier_urls=$1 # le fichier d'URL en entrée
fichier_tableau=$2 # le fichier HTML en sortie

if [[ $# -ne 2 ]]
then
    echo "Ce programme demande exactement deux arguments." 
    exit
fi

mot="[Đ/đ]ình_công" # L'expression régulière du mot grève en vietnamien.

echo $fichier_urls;
basename=$(basename -s .txt $fichier_urls) # Nom de base des fichiers

# Construction du début du tableau.
echo "<html><body>" > $fichier_tableau
echo "<h2>Tableau $basename :</h2>" >> $fichier_tableau
echo "<br/>" >> $fichier_tableau
echo "<table>" >> $fichier_tableau
echo "<tr><th>Ligne</th> <th>Code</th> <th>URL</th> <th>Encodage</th> 
<th>Dump HTML</th> <th>Dump text</th> <th>Occurrences</th> <th>Contextes</th><th>
Concordances</th></tr>" >> $fichier_tableau
                    
lineno=1;
while read -r URL; do

# Récupération des pages web utilisées en format html
    aspirations=$(curl $URL > "./aspirations/$basename-$lineno.html")
    
    echo -e "\tURL : $URL";
    code=$(curl -ILs $URL | grep -e "^HTTP/" | grep -Eo "[0-9]{3}" | tail -n 1)
    charset=$(curl -ILs $URL "./aspirations/$basename-$lineno.html" | grep -Eo "charset=(\w|-)+" | cut -d= -f2 | tail -n 1)

    echo -e "\tcode : $code";

# Détection de l'encodage

    if [[ ! $charset ]]
    then
        echo -e "\tencodage non détecté, on prendra UTF-8 par défaut.";
        charset="UTF-8";
    else
        echo -e "\tencodage : $charset";
    fi

# Code HTML : s'il est de 200 alors on récupère le contenu de la page, sinon on utilise un dump vide.
    if [[ $code -eq 200 ]]
    then
        dump=$(lynx -dump -nolist -assume_charset=$charset -display_charset=$charset $URL)
        if [[ $charset -ne "UTF-8" && -n "$dump" ]]
        then
            dump=$(echo $dump | iconv -f $charset -t UTF-8//IGNORE) # Conversion en UTF-8
            # dump_vn=$(echo "$dump" | python3.9 Tokenizer/Tokenizer_VN.py) Tokenizer qui ne marche pas pour une raison inconnue
        fi
    else
        echo -e "\tcode différent de 200 utilisation d'un dump vide"
        dump=""
        charset=""
    fi


# On dump le contenu des pages dans un dossier en format texte.
    echo "$dump" > "./dumps-text/$basename-$lineno.txt" 

# On utilise le tokenizer sur le contenu qui vient d'être dumpé afin que les mots composés soient liés en un seul
# On dump ces nouveaux fichiers dans un autre dossier.

    dump_vn=$(cat "./dumps-text/$basename-$lineno.txt" | python3.9 Tokenizer/Tokenizer_VN.py > "./dumps-tokenize/$basename-$lineno.txt")

# Compte des occurrences

    compte=$(grep -P -o -i $mot "./dumps-tokenize/$basename-$lineno.txt" | wc -l)

# Construction du contexte 

    contexte=$(grep -P -A2 -B2 $mot "./dumps-tokenize/$basename-$lineno.txt"  > "./contextes/$basename-$lineno.txt")
    
# Construction des concordances

        bash programmes/concordance.sh ./dumps-tokenize/$basename-$lineno.txt $mot > ./concordances/$basename-$lineno.html

# On ferme le tableau
    echo "<tr><td>$lineno</td><td>$code</td><td><a href=\"$URL\">$URL</a></td><td>$charset</td><td><
    a href="../aspirations/$basename-$lineno.html">html</a></td><td><a href="../dumps-tokenize/$basename-$lineno.txt">text</a></td><td>$compte</td><td><
    a href="../contextes/$basename-$lineno.txt">contextes</a></td><td><a href="../concordances/$basename-$lineno.html">concordance</a></td></tr>" >> $fichier_tableau
    echo -e "\t--------------------------------"
    lineno=$((lineno+1));

done < $fichier_urls
echo "" >> $fichier_tableau
echo "" >> $fichier_tableau 
            
            



































Description précise du contenuEntrons dans les détails...

Passons maintenant à la description précise du contenu et des commandes du script.
Le script étant très similaire à celui du tableau bash de base, seules les différences seront notées.


fichier_urls=$1 # le fichier d'URL en entrée
fichier_tableau=$2 # le fichier HTML en sortie

if [[ $# -ne 2 ]]
then
    echo "Ce programme demande exactement deux arguments."
    exit
fi
mot="[Đ/đ]ình_công"

	


Cette partie indique qu'il faut entrer deux arguments lors de l'exécution du script, l'expression régulière étant déjà déclarée.
Il faut noter l'existance du "_" dans l'expression. C'est une jointure faite par le tokenizer plus bas, qui sert à joindre deux mots pour n'en faire qu'un.

# On dump le contenu des pages dans un dossier en format texte.
    echo "$dump" > "./dumps-text/$basename-$lineno.txt" 

# On utilise le tokenizer sur le contenu qui vient d'être dumpé afin que les mots composés soient liés en un seul
# On dump ces nouveaux fichiers dans un autre dossier.

    dump_vn=$(cat "./dumps-text/$basename-$lineno.txt" | python3.9 Tokenizer/Tokenizer_VN.py > "./dumps-tokenize/$basename-$lineno.txt")
		

Avant de compter les occurences, construire le contexte et d'exécuter le programme de concordances, il faut régler le problème lié à la langue Vietnamienne.
Certains mots en Vietnamien sont composés de deux éléments, comme pour le mot grève : đình công et l'espace n'est pas compris par egrep. Pour cela, les professeurs ont mis à disposition un tokenizer.
Pour l'utiliser, il faut d'abord dump le contenu des textes dans un dossier pour en garder une trace. Ces textes seront repris ensuite et le tokenizer va leur être appliqué avec la commande "python3.9" avant d'être dump corrigés dans un nouveau dossier.
Ce nouveau dossier sera celui appelé dans les prochaines lignes.