Category: Cours de programmation


Exercice : Encodage

 

 

 

 

Merci pour votre lecture et à la prochaine.

Maknie attend votre(vos) commentaire(s).

par Samantha
 

Big problem is watching you

Depuis plusieurs semaines, je perds des neurones sur de script. Je n’ai rien publié depuis car je voulais arriver à emboîter toutes les commandes sur un même script pour pouvoir l’exécuter. Le problème (un parmi tant d’autres), c’est que lorsque je curl maintenantla commande curl ne me donne que des erreurs => retour curl = 23 et ce pour toutes les lignes.

Ceci m’empêche d’effectuer le reste du traitement.

Pourtant mon script à l’air complet :

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

par Samantha
 

Les expressions régulières :

Elles servent à écrire de manière générique des chaînes de caractères qui ont des caractéristiques communes.

Comment peut-on écrire une url ? une date ? Elles permettent de décrire de manière concise des classes de chaînes de caractères. Cela passe par le repérage de motifs ou patron. Cela nous sert à localiser les zones qui nous intéressent. Cependant il est parfois difficile de définir le modèle.

\bmot\b

\bbiocarburant(s)\b

Les meilleurs outils de travail sur les données textuelles intègrent l’utilisation des expressions régulières. cependant la syntaxe des exp. régulières peut varier dans certains outils mais la syntaxe peut varier, mais le principe est touours le même.

Comment décrire des motifs d’expressions régulières ?

Ces motifs sont utiles pour chercher les chaînes de caractères qui nous intéresse. Il y a des caractères simples et aussi des caractères spéciaux (opérateurs).

. \ ^$ | () []

En général, les motifs sont assez complexes.

 

Les opérateurs complémentaires :

[…] signifie ensemble de caractères. ce qui est entre crochets correspond à 1 caractère.

r[iau]g  => ring, rang, rung

Chaîne de caractères alternatifs :

|

Exemple : in (any|every) => in any, in every

Les intervalles :

on vise un caractère compris dans l’intervalle entre crochets :

[0-9] => (0,1,2,3,4,5,6)

La négation  d’un ensemble de caractères :

[^…] porte une négatin sur les éléments constitutifs de l’ensemble situé entre crochets.

supprimer une balise HTML : <[^<>]> supprime tout ce qui est entre chevrons « supprime toutes chaînes de caractères qui est tout sauf des chevrons »

avec sed on lui donne substitute, il le remplace par rien.

sed -e « s/<[^<>]>// »

Les quantificateurs :

? signifie que le caractère qui précède est optionnel

arbres? => arbre; arbres

interest (s|(ed|ing)(ly)?)? => interest, interests, intersted, interestingly

* remplace n’importe quoi

 +        => as [a-z]+ as  => au moins une occurrence

marquer des répétitions {}

Le point peut marquer n’importe quel caractère sauf le retour à la ligne.

Les opérateurs de frontières :

^ => début de chaîne

$=> fin de chaîne

\w => caractère de mot, n’importe quel caractère alpha-numérique  ; \b\w+\b : permet de reconnaître beaucoup de mots, mais pas tous (pas les mots accentués par exemple)

\W => n’importe quel caractère non caractère de mot

\b => frontière d’un mot à gauche ou à droite

Le parenthésage :

Le parenthésage permet de construire des expressions complexes. La femeture est plus forte que la concaténation qui est plus forte que l’union.

* : caractère de fermeture qui s’applique à ce qui précède.

a|b(c*)d devient ((a| ((b(c*))d))

\ : déspécialise le caractère qui le suit.

voir le man de « egrep » qui présente des carctère d’expressions régulières intéressants.

Voir les opérateurs de Regex.

La commande egrep

filtrage de lignes dans un fichier qui correspond à des lignes et affichage des lignes concernées.

Options egrep : voir manuel

-l : ne pas tenir en compte majuscule et minuscule

-o : affiche toutes les occurrences reconnues du motif

-v : afficher les lignes qui ne contiennent pas les lignes vides.

Supprimer les lignes vides dans un fichier et de le mettre dans un fichier, le même fichier sans lignes vides.

egrep -v  » ^$ » toto.txt >totosansligne.txt

Par défaut egrep affiche la ligne contenant le motif . -o cherche le motif et affiche uniquement la chaîne de caractères reconnu, si il y a plusieurs fois le motif sur une même ligne il sera affiché plusieur fois.

egrep-o « \bcitoy\w+ »  => afficher tous les mots qui commencent par citoy dans le fichier.

|sort-u  => affiche les différentes formes du mot « citoyen, citoyens, citoyennes, citoyennes »

On peut faire une demande de requête élargie avec egrep.

 

Exercice : commande Iconv

 

 

 

 

 

 

 

 

Merci pour votre lecture et à la prochaine. 

Maknie attend votre(vos) commentaire(s)

L’encodage des pages :

Il faut si la page n’est pas en UTF8 ,  faire le dump dans l’encodage détecté, et préciser la sortie du dump.

Il faut mettre un verrous :

Pour décoder l’encodage de départ et forcer l’encodage en UTF8 en sortie.

If  PAGES ASPIREE est en UTF8

Alors DUMP en UTF8

else ; Dump dans l’encodage détecté concesion de dump en UTF8

S’assurer de l’encodage avant de faire le Dump : détecter l’encodage, le mettre en utf8 et faire le dump.

Commande file -i   ..PAGES ASPIREES/1/13.html  , donne l’encodage du document.

on obtient charset=utf-8, on ne peut faire lynx que lorsqu’on sait dans qel code est écrit la page.

La commande CUT :

cut : dans le man, étant donné un fichier, extraire des colonnes dans ce fichier.

On considère ce qui est donné par file-i comme deux colonnes avec une première colonne pour ce qui se trouve avant = et une deuxième pour ce qui se trouve après.

Cut-f : définir les colonnes qui nous intéresse. ici la 2

cut-d : spécifier le marqueur de colonne (par exemple le délimiteur de colonne c’est le caractère = et la deuxième colonne c’est ce qui se trouve après)

On écrit :

on crée la variable encodage

encodage=$ ( file -i ../PAGES ASPIRES/1/13.html | cut -f2 -d= utf-8)

ensuite

echo $encodage

utf-8

Pour le lynx on fait ensuite :

lynx -dump -nolist -display_charset =$encodage

if [encodage== »utf-8]

else

encodage=$(………..)

lynx -d -u -cd = $encodage

Transformer par exemple un codage ISO  en UTF8 avec ICONV

3ème cas de figure : ICONV ne connaît pas l’encodage de départ et ne peut pas le convertir en UTF8

On se sert de la balise charset qui se trouve sur le code html dans la balise meta. Il faut aller chercher dans le fichier html aspirées le contenu de la chaine de caractère meta.

Commande egrep :

egrep : commande de filtrage, elle va chercher un motif exprimer entre guillemets (chaîne de caractères) dans un fichier. Cette commande permet d’extraire des lignes du fichier contenant la chaîne de caractères voulue.

egep « charset= »

exemple :

egrep « charset= » ../PAGES ASPIRES/1/13.html

<meta ……..charset=ISO>

egrep « charset= » ../PAGES ASPIRES/1/13.html |cut -f4 -d =

iso-8859

Il faut pouvoir isolé le charset on peut utiliser le cut mais il se peut que l’on ne sache pas combien de colonne il y a dans la balise meta, pb pour le cut Il faut arriver à dire que l’on veut isoler  l’endroit comportant le charset  pour prendre ce qu’il y a après.

puisque la comande cut-d n’accepte que des caractère unique comme marqueur de commande, on doit transformer la chaine de caractère « charset » en un seul caractère non ambigu pour s’en servir comme marqueur de colonne.

On utilise une nouvelle commande : sed

La commande SED :

sed : c’est un éditeur dans la ligne de commande qui permet de faire du rechercher remplacer directement dans la ligne de commande.

syntaxe :

on utilise par exemple  | ou @ comme caractère de remplacement.

Rechercher _Remplacer

sed -e  » s/charset/\@/ »   => \ permet de déspécialiser @  pour dire que c’est bien ce caractère si il est un opérateur d’expression régulière.

Sed a une syntaxe différente selon les expressions régulières, cela dépend de la puissance de la base d’expression régulière. La base minimale des opérateurs d’exp. régulières est a même pour pearl python,etc en linux.

Maintenant le marqueur de colonne c’est @ qui remplace la chaîne de caractère charset.

on utilise alors un deuxième cut en se servant de @ comme marqueur de colonne. Il ne faut pas utiliser un caractère qui correspond à un opérateur connu comme caractère de replacement, sinon, il faut le mettre entre guillemets.

egrep « charset= » ../PAGES ASPIRES/1/13.html |sed -e « s/charset/\@/ » | cut-d « @ » -f2

ou …………………………………………………………………………………………….cut- \@

on obtient ISO-5589-1″>

on ne veut que ISO-5589-1 donc on ajoute un sed pour supprimer tout ce qui a après le  »

sed -e « s/.\ ».*$// »

rechercher . (ie n’importe quel chaine de caractère) devant  » suivit de n’importe quel caractère en fin de ligne ($), remplacer par rien. On supprime tout ce qui suit le  »

Attention : si l’encodage n’est pas détecté, on ne lance pas de lynx. on bloque le traitement si l’aspiration s’est mal passé.

sort-u pour n’avoir qu’une seule occurrence de ce qu’on est en train de chercher.

Exercice : commande lynx

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Merci pour votre lecture et à la prochaine. 

Maknie attend votre(vos) commentaire(s)

par Samantha
 
 

Le retour curl donne 0 :

la commande a fonctionné, cependant, il y a des pages qui ne sont pas disponibles. on obtient des messages tels que « bad request », « oops! » « pages indisponibles ». Les serveurs ne veulent pas nous laisser aspirer les pages.

Il faudra s’assurer d’avoir un résultat et qu’on a récupérer un fichier existant. Il faut vérifier que le fichier contient toujours l’occurrence.

Il faut poser une condition if le code retour est égal à 0 et if le fichier contient bien l’occurrence du mot.

La commande Lynx :

On souhaite ajouter une commande supplémentaire pour ne garder que le contenu textuel de la page car curl récupère tout le codage html, on ne veut garder que le contenu textuel.

Lynx une commande unix qui est en fait un navigateur Web en ligne de commande comme firefox, internet explorer ou autre.Ce qui nous intéresse c’est une option qui s’appelle -dump pour duper, filtrer le text, il s’agit de filtrer le contenu textuel de l’url associé.

lynx-dump http://monsite.org

Il mémorise tous les liens présents dans la page en les numérotant entre crochets, et donne à la fin à quoi correspond le lien. L’option qui permet de ne pas avoir ces liens : -nolist, cela correspond mieux à ce qu’on recherche.

 

Il faut que toutes les sorties produites soient en UTF-8.  Il faut s’assurer que la page est dans le bon code, comment déterminer l’encodage de la pages aspirée.

Si c’est de l’UTF8 : alors on peut faire une extraction et le contenu sera maintenu.

si ce n’est pas de l’UTF alors il faut reconnaitre l’encodage de la page, éventuellement utiliser lynx pour voir la page et convertir la page en utf8. Il faut déterminer le charset de fichier en sortie

-display_charset (permet de spécifier dans quel encodage sera le lynx – dump.

-displpay_charset=UTF-8 permettra de récupérer une page en UTF8. Si la page est en UTF : lynx -dump -display_charset=UTF8

si la page n’est pas UTF8  il faut essayer de détecter l’encodage de la page.on précise les options de lynx -display_charset=UTF8 et ensuite en sortie convertir la page en UTF8. (voir option)

 

Comment connaître l’encodage d’une page ?

Commande : file  avec l’option -i file-i truc.html

Il nous faut connaître l’encodage de départ et l’encodage de sortie pour faire la conversion. Bien sûr on ne doit pas faire les traitement pour les pages qui ne donne sur rien.

 

à faire : Modifier le script pour :

1- si le retour curl nous donne une page qui ne donne sur rien, mettre en place une condition if pour que seule les pages existantes soient traitées.

2-  Insérer une colonne pour signaler le codage de départ du texte aspiré.

Tester si ce n’est pas en UTF8 convertir en UTF8 els

 

Cours du 9 novembre

Correction du script de création tableau :

On corrige le script qui sert à créer le tableau avec un numéro en face de chaque urls.

comment éviter d’avoir à écrire à chaque fois l’exécution du script.

Redirection entrante pour éviter d’écrire à chaque fois le nom de fichier entrant et le nom de fichier de sortie. On va mettre en place une astuce pour permettre au script d’aller directement récupérer les informations sasns que l’utilisateur n’ait à entrer les noms de fichiers.

On écrit de manière définitive dans un fichier les valeurs des entrées et sorties qu’on veut générer :

./URLS/url-biocarburant-fr.txt

./TABLEAUX/tableau-urls-fr-kh.html

que l’on nomme input.txt

On modifie le script fait tableau en supprimant les deux lignes echo :

read fic;

read tablo;

echo « Le nom du fichier html ou stocker ces liens $tablo »;

Lorsqu’on exécute le fichier on le fait suivre du nom du fichier de stockage. La première ligne du script ‘read fic’ va lire le nom du fichier stockage :

sh fait-tableau-version1-input.sh   <  sh input.txt

=> redirection de flux.

Point HTML : pour faire une liste entrer la balise <ol> et pour numéroter les ligne on utilise la balise <li> pour avoir des points, on utilise la balise <ul>

On peut peut pas utiliser ce codage pour numéroter les lignes d’urls.

On utilise un code qui compte les lignes grâce à une variable. Première ligne i=1 et ajouter 1 à chaque fois qu’on passe une ligne.Puis on affiche la valeur du compteur au moment ou j’écris la ligne.

echo « <tr><td>$i>/td></tr>>td>tr>$nom</tr></td>

Puis il faut incrémenter c’est à dire ajouter 1 à i pour chaque ligne.  i=i+1

<=>i+=1  : incrémentation et assignation à la fois.

let »i+=1 »

ou i=` expr $i+1`;

Point HTML :

<td><a href= »http.//lien.com »> url1</a></td>

Pour notre script, on veut tous les liens soient clicables.

On écrit  echo « <tr><td>$i</td></tr><td><tr><a href=\ »$nom\ »>$nom</a></tr></td>

\ »$nom\ » : affiche la valeur de $nom, donc l’url.

Comment traiter du même coup les deux fichiers d’urls ?

Dans la boucle en input  on va écrire read rep puisqu’il ne s’agit plus d’un fichier mais d’un répertoire de fichiers.

On change le fichier input :

./URLS

../TABLEAUX/tableau-urls-fr-kh.html

en écrivant read rep;

onveut dire au programme : pour chacun des fichiers de rep on veut que la boucle soit lue.

=> à ce stade tout est écrit dans un seul tableau donc on doit ajouter :

read tablo;

echo « <html><body> » >$tablo;

=>on aura autant de tableau que de fichiers.

On remet une boucle for fic in ‘ls $rep` => ls liste le contenu du répertoire.

Dans cette boucle for, on va pouvoir traiter 1 fichier

echo « <tableau> »>>$tablo;

cat : il faut reconstruire le chemin du fichier que l’on veut traiter. par rapport à l’endroit où l’on se trouve. pour accéder au fichier que l’on veut traiter c’est $rep et pour traiter le fichier c’est $fic

`cat  $rep/$fic`

Si on n’indique pas le chemin, le terminal va afficher Error : aucun fichier de ce nom, car on ne lui aura pas indiqué le bon chemin.

Cours du 2 novembre (suite)

Par Samantha -prise de notes en live

Première étape : script mot

cf : cours en ligne http://www.tal.univ-paris3.fr/cours/PROJETMOTSURLEWEB

Ecrire une programme pour récuperer les urls les mettre dans un tableau avec une numérotation.

Pour ce faire, on image que notre fichier d’url est un ensemble : pour chaque url x appartenant  au fichier d’url je veux qu’il apparaissent dans une ligne du tableau.

for x in X {

Il faut trouver un moyen pour pouvoir considérer notre fichier url comme un ensemble, pour pouvoir considère chaque élément de l’ensemble.

Astuce : Lorsqu’on fait un cat d’un fichier, le terminal affiche la liste des ligne du fichier. Il affichera la liste des url du fichier. Utiliser un cat du fichier permettra d’afficher à l’écran l’ensemble des url du fichier. Le retoure à la ligne va être le segmenteur et on pouvoir obtenir virtuellement un ensemble d’urls.

Pour la constitution de l’ensemble des urls on va récupérer le résultat d’une commande à la fenetre de commande. comme ensemble résultat de la boucle for on récupère le résultat de cat en utilisant « l’inverted quote’

for (x) in ‘cat $fic’

Read fic : le bash attend qu’on lui donne qqchse au clavier pour l’introduire dans la variable fic. Lorsqu’on veut invoquer la valeur du contenu de la variable, il faut le $.

si on écrit x= »url.txt »

echo $x on a url.txt

Si on veut afficher le contenu de la variable il faut utiliser le $

x= »serge »

echo « bonjour $x »

résultat : Bonjour serge

la variable garde la même valeur tant qu’on a pas changer son contenu par une affectation. Dès qu’on change son contenu la variable change.

Autre façon de faire des affectations :

read : affectation d’un valeur à une variable ( juste le nom pas le contenu)

fic : bien qu’il contienne le nom du fichier avec le chemin relatif, cela ne veut pas dire qu’il contient les chaine de caractères du fichier lui même. On donne à fic juste une valeur qui est une chaine de caractères.

read fic si on rentre url.txt si on fait echo $ fic ( permet d’accéder à la valeur de la variable)on nous donne url.txt

cat $fic : affiche le contenu du fichier fic qui est la variable. On va donc obtenir tout le conteu du fichier url.txt

les quotes inversés :`  `

on dit au shell d’exécuter la commande et de ramenr le résultat dans le ctxt de l’autre commande que l’on fait. signification : exécuter la commande et afficher son contenu.

CF. Doc : Premiers Scripts tableau de lien

Une boucle for pour indiquer à la machine d’aller elle même à chaque ligne d’url.

for nom in `cat $fic`

résultat : http://www.html

http://…&#8230;

{

echo « <tr><td> $nom</tr></td>

}

for fait une affectation à nom

après les accolades la boucle for ferme les balises. sur Ubuntu les accolades sont remplacée par do et done

Créer un script capable de prendre en entrée tous les fichiers urls, à lancer une seule fois

Par Samantha – prise de note en live

La balise <meta>;

très importante à renseigner. Lorsqu’on écrit la page, il faut enregistrer le document écrit sous notepade++ il faut l’enregistrer en UTF-8 et préciser dans la balise meta « content » UTF-8.

Lorsqu’on écrit une page dans quel encodage est-on ?

Utiliser la commande FILE

file(espace) -i nom du fichier : cette commande nous donne en quel charset on a écrit.

Toujours se demander dans quel encodage on écrit et comment le repérer.

Il y a une commande qui permet de convertir un encodage dans un autre : iconv

Ce n’est pas parce qu’on dit UTF-8 dans la balise méta que l’on est dans un encodage UTF-8

TOUT CE QUI DEVRA ETRE GENERE DEVRA ETRE CODE EN UTF-8 !

Commande Unix qui permet de savoir dans quel encodage on est  et aussi la localisation: locale

Schéma représentant la chaîne de traitement :

EXPLICATION :

extraction des URL : si la page est en UTF-8 on pourra extraire la page en utilisant la commande lynx.

si la page de l’url n’est pas codée en UTF-8 : il faudra trouver dans quel code est faite la page, la changer en UTF-8.

Bloucle : for > pour chaque éléments du tableau passage par l’encodage et traitement.

Un traitement supplémentaire pour compter les mots de la page de chaque url.

Le traitement doit être capable de construire des tableaux de tel sorte que pour chaque url le lien pointe vers la page, et montre quelle est son encodage.