Licence Math/Info - L1
Automates
TP2 – Traitement de fux par automates
Précisions sur les expressions régulières
:
Les caractères spéciaux pour écrire des expressions régulières :
• . : reconnaît n'importe quel caractère,
• | : disjonction de deux expressions
• ? / * / + : fermeture (répétition) au moins 0 / 0 / 1 fois et au plus 1 / n / n fois,
• {m,n} : répétition au moins m fois et au plus n fois
• [] : classe de caractères :
◦ [aciur] : un des caractères listés,
◦ [a-f] : tous les caractères (ici entre a et f),
◦ [a-Z] : caractères majuscules ou minuscules,
◦ [:alpha:] : classes de caractères, selon le logiciel (grep, sed, Java, Python, etc.),
◦ [^fgt] : complémentaire : n'importe quel caractère sauf ceux spécifés (ici f, g et t),
• () : pour isoler une sous expression,
• ^ / $ : reconnaît le début / la fn d'une ligne.
Attention : lorsque l'on veut trouver un de ces caractères spéciaux au sein d'un fux de données (par ex. un point « . » pour trouver une fn de phrase) il faut le faire précéder du caractère d'échappement « \ » (par ex. « \. »).
Les scripts shell
:
Un script shell est un fchier texte, avec extension « .sh » qui contient un ensemble de
commandes telles que vous les écrivez dans un terminal. Pour l'exécuter, il suft de le rendre exécutable avec la commande :
chmod u+x script.sh
Les commandes à l'intérieur du script peuvent fonctionner en mode « fux », à l'aide des commandes de redirection « | » (entre scripts) et « > » sortie vers un fchier:
cat test.txt | grep "bonjour" | sort > bonjours.txt
Les variables sont défnies et utilisées de la manière suivante : variable="Hello world"
echo $variable
Pour qu'une variable récupère le résultat d'une commande, faire $(cmd) : fchiers=$(ls)
echo $fchiers
Il est possible de faire des boucles qui auront alors la forme suivante : for fc in $fchiers; do
echo $fc
cat $fc | grep "test" > $fc_test.txt done
Les afchages simples se font avec la commande « echo » echo "Hello world"
echo $fchiers
Vous pouvez commentez (le code ou ajouter des explications avec « # »)
# Ici un code qui exécute l'expression régulière
Récupérer et analyser un fchier HTML
:
Le HTML est le langage utilisé pour structurer le contenu sur Internet. Chaque fchier HTML contient, au format texte, des « balises » qui peuvent prendre la forme suivante (attention au slash « / ») :
• une paire de balises :
◦ ouvrante : <balise attribut1="valeur1" attribut2="valeur2" ... >,
◦ fermante : </balise>,
• une balise « vide » : <balise attribut1="valeur1" attribut2="valeur2" ... />.
Pour récupérer le contenu d'un site web, nous enregistrons le code de la page. Dan un navigateur, allez sur la page sélectionnée. Consultez le « code source » de la page que vous pourrez copier / coller dans un un fchier, par exemple « site.html ». Sous Linux, la commande
« curl » peut-être utilisée pour ce faire.
1. Créez un script shell qui :
• enregistre une page de contenu du site (article) dans le fchier curl www.site.com/indexhtml > site.txt,
• afche combien il y a respectivement, dans « site.txt », de :
◦ balises HTML (en trouvant la bonne expression érgulière regexp) : nbbal=$(cat site.txt | grep -Eo "regexp" | wc -l)
echo "Il y a $nbbal balises dans le fchier"
◦ balises ouvrantes (idem sauf regexp),
◦ balises fermantes (idem sauf regexp),
◦ balises vides (idem sauf regexp),
◦ balises « liens » : « <a ... > ... </a> » (idem sauf regexp),
• enregistre dans un fchier séparé les :
◦ paragraphes (et leur contenu) : « <p ... > ... </p> », cat site.txt | grep -Eo "regexp" > site_liens.txt
◦ items de listes (et leur contenu) : « <li ... > ... </li> ».
cat site.txt | grep -Eo "regexp" > site_items.txt Capturer une partie de l'expression régulière
:
Les expressions régulière permettent de « capturer » (mémoriser) une partie de ce qui a été reconnu, lorsque cette partie est entre parenthèses. Par exemple, « a(b*)c », la partie entre parenthèses est capturée et stockée dans une variable « \1 » qui peut-être utilisée plus loin dans l'expression régulière. De manière général, on peut utiliser « \x » où « x » est le numéro de la parenthèse ouvrante.
Ainsi, « a(b*c*)d\1e » reconnaît une expression commençant par un « a », suivi de 0 ou plusieurs « b » et « c », puis un « d », enfn la même chaîne de « b » et « c » que
précédemment, enfn un « e ».
2. Créez un script shell qui :
◦ enregistre dans un fchier les titres : « <h1...> ... </h1> », « <h2 ... > ... </h2> »,
◦ enregistre toutes les balises en doublons,
◦ enregistre les lignes qui ont deux fois des balises de liens, paragraphes ou titres,
◦ enregistre les lignes qui ne contiennent pas de balise ouvrantes qui soit fermées (dans grep, utilisez « -Ev » pour inverser les résultats et afcher les lignes).
Efectuer des remplacements dans un fux de données
:
Il est possible, de la même manière que « grep » reconnaît des expressions régulières, de faire des remplacements en sortie. La commande « sed » (Stream EDitor) efectue ce type d'opérations, lorsque l'on fournit une expression régulière et ce qui doit remplacer les occurrences :
sed -r "s#expression#remplacement#g" (ici nous utilisons « # » pour séparer les parties de la commande, mais
habituellement « / » ou « | » sont utilisés)
3. Créez un script shell qui enregistre dans des fchiers le site où :
◦ chaque occurrence de la chaîne « info » est remplacés par « INFO » : cat site.txt | sed "cmd" > site_info.html
◦ chaque occurrence de « Sarkozy » est remplacée par « Obama »,
◦ toutes les images sont efacées («<img... /> »).
4. Créez un script shell qui afche toutes les classes CSS distinctes(« <balise class="..."> »).
5. Créez un script shell qui :
◦ enregistre dans une variable toutes les URL des liens présents dans le site :
▪ « <a ... href="URL" ... /> »
◦ pour chaque lien (grâce à une boucle « for ») :
▪ afche l'URL,
▪ enregistre la page web (grâce à « curl ») dans un dossier « liens »,
◦ pour chaque page web enregistrée dans le dossier (avec « ls ») :
▪ enregistre le fchier sans aucune balise dans un fchier avec extension « .txt »,
◦ remplace les URL des liens du fchier « site.txt » pour qu'ils pointent vers « ./liens/ » au lieu du site d'origine.
6. Faites de même pour :
• les images : « <img... src="URL ... /> »
• les feuille de style CSS : « <link type="text/css" href="URL" ... /> » Efectuer des remplacements avec captures dans un fux de données
:
Il est possible de remplacer une partie de l'expression régulière avec ce qui a été capturé.
Pour cela, utilisez le même mécanisme de capture « \x » tout en faisant des remplacements à, l'aide de « sed ».
7. Créez un script shell qui enregistre dans des fchiers le site où :
◦ les images ont un attribut « width="100px" » (« <img ... width="100px" ... /> »),
◦ sont remplacées l'URL et le titre du lien :
« <a href="url">titre</a> » devient « <a href="titre">url</a> »,
◦ est recopiée la classe CSS d'un élément précédée de « CSS: » :
« <balise class="cl">... » devient « <balise class="cl">CSS:cl... »,
◦ sont échangées les imbrications de code HTML à deux niveaux :
« <balise1> ... <balise2> ... </balise2> ... </balise1> »
devient « <balise2> ... <balise1> ... </balise1> ... </balise2> ».
8. Faites une proposition (dans un fchier texte, ou codez-la en script shell) de la manière dont il serait possible d' « aspirer » un site web :
• créez les dossiers à l'image des URLs (le « / » sépare un dossier de son contenu),
• enregistrer tous les fchiers,
• faire en sorte que le site fonctionne « localement » : les liens, images, styles, etc.
pointent vers les répertoires sur la machine.