Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :Nettoyer une importation Html
Dans le volet précédent, nous avons appris Ã
importer du contenu du Web par le
code VBA Access. Mais nous avions réalisé que de nombreuses informations superflues parasitaient le rendu, notamment à cause d'innombrables
balises Html. Dans ce nouveau chapitre, nous allons apprendre à purger l'intégralité des contenus importés, sur des séquences remarquables identifiant ces balises, grâce aux
expressions régulières.
Base de données Access à télécharger
Pour poursuivre les travaux, nous devons récupérer ceux que nous avons aboutis à l'occasion du volet précédent.
- Télécharger le fichier compressé nettoyer-balises-html.rar en cliquant sur ce lien,
- Le décompresser dans le dossier de votre choix,
- Double cliquer sur le fichier résultant pour l'ouvrir dans Access,
- Dans le volet de navigation sur la gauche, double cliquer sur le formulaire FWeb,
- Dans la zone de recherche du formulaire, taper les mots suivants : Marion Cotillard,
- Puis, cliquer sur le bouton intitulé Trouver,
La réponse à la demande est importée du site
Wikipédia, presqu'instantanément dans la zone de texte enrichie du formulaire. Cependant, il faut une bonne douzaine de clics sur l'ascenseur vertical pour atteindre la partie utile, celle qui fournit les informations souhaitées. Toute la partie supérieure relate l'organisation du site appelé, notamment avec ses menus. Et ce sont de nombreuses
balises Html à purger qui traduisent cette organisation non nécessaire dans cette restitution.
Atteindre la partie utile de l'article
Après avoir étudié la structure des pages du site Wikipédia, nous avons constaté que le contenu utile intervenait après une
balise H2 fermante (</h2>). C'est la raison pour laquelle, dans le code existant dans un premier temps, nous proposons d'exploiter la
fonctionde découpe Mid, afin de prélever les informations importées à partir de cette position.
- En haut à gauche du ruban Accueil, cliquer sur la flèche du bouton Affichage,
- Dans les propositions, choisir le mode Création,
- Sur le formulaire en conception, cliquer sur le bouton Trouver pour le sélectionner,
- Dès lors, activer l'onglet Evénement de sa feuille de propriétés,
- Puis, cliquer sur le petit bouton associé à son événement Au clic,
C'est ainsi que nous basculons dans l'
éditeur VBA Access entre les bornes de la
procédure événementielle trouver_Click. Elle est déjà implémentée puisque c'est elle qui se charge de récupérer le contenu du Web en fonction des mots clés tapés.
- Vers la fin de l'instruction conditionnelle, ajouter l'instruction VBA suivante :
...
article = objFlux.ReadText()
article = Mid(article, InStr(1, article, "</h2>") + 5)
contenu.Value = article
...
Grâce à la
fonction Mid, nous découpons l'article récupéré pour ne considérer le contenu qu'à partir de la
balise h2 fermante (</h2>). Cette position est retournée par la
fonction de recherche InStr. Nous ajoutons 5 unités à cette position pour ne procéder au prélèvement qu'après cette balise, effectivement constituée de 5 caractères.
- Enregistrer les modifications (CTRL + S) et revenir sur le formulaire en conception (ALT + Tab),
- L'exécuter, par exemple avec la touche F5 du clavier,
- Dans la zone de recherche, taper les mêmes mots clés que précédemment : Marion Cotillard,
- Puis, cliquer sur le bouton Trouver,
Comme vous pouvez l'apprécier, nous récupérons cette fois le contenu directement à partir de l'emplacement qui nous intéresse. C'est bien là que l'article descriptif débute. Certes, il reste des informations résiduelles à nettoyer.
La fonction de traitement
C'est la raison pour laquelle nous devons maintenant développer la
fonction permettant de traiter ce contenu pour le purger des résidus avant de le restituer dans la zone de texte du
formulaire Access.
- Sous la procédure trouver_Click, créer la fonction traiter comme suit :
Function traiter(chaine As String) As String
Dim expReg As Object: Dim motif As Object
Dim quotes As String: Dim compteur As Integer
quotes = Chr(34): compteur = 0
End Function
Nous déclarons deux objets pour instancier la
classe des expressions régulières et pour manipuler les séquences remarquables à trouver dans le contenu récupéré. La
variable quotes est déclarée comme un texte (As String). Nous l'utiliserons dans le modèle de l'expression régulière pour insérer les
guillemets au milieu des autres caractères à considérer. Et c'est effectivement sur les guillemets que nous l'initialisons ensuite grâce à la
fonction VBA Chr. Nous typons la
variable compteur comme un entier (As Integer) et nous l'initialisons à zéro. Nous l'utiliserons comme
variable de boucle pour parcourir toutes les séquences remarquables des balises Html, dans le contenu importé.
La classe des expressions régulières
Puisque nos objets existent, nous devons maintenant les exploiter notamment pour
instancier la classe des expressions régulières. Et comme vous le savez, c'est la
précieuse fonction VBA CreateObject qui permet d'instancier une classe spécifique, selon la valeur qui lui est passée en paramètre.
- A la suite du code, ajouter les deux instructions VBA suivantes :
...
Set expReg = CreateObject("vbscript.regexp")
expReg.Pattern = "(<)[0-9a-zA-Z_ " & quotes & "%&#âà éèêùîô_?\/,().:;'=-]*(>)"
...
La seconde ligne est fournie dans le fichier texte issu de la décompression de la source téléchargée.
Grâce à cette instanciation, l'objet expReg ainsi intialisé (Set) hérite des propriétés et méthodes pour manipuler les expressions régulières. C'est ainsi que nous exploitons tout de suite sa
propriété héritée pattern. Elle permet de définir la forme de la séquence remarquable pour débusquer les
balises Html dans le contenu récupéré. Nous indiquons que ces séquences débutent nécessairement par le
symbole inférieur (<) et qu'elles se terminent obligatoirement par le
symbole supérieur (>), quels que soient les caractères, comme des chiffres et des lettres (0-9a-zA-Z) ou des caractères plus particuliers, situés entre ces deux symboles et quel que soit leur nombre (*).
Préserver certaines balises Html
Avant de lancer le processus de nettoyage, nous souhaitons préserver quelques attributs comme les retours à la ligne et le style gras sur les mots mis en valeur. Les paragraphes sont encadrés par les balises <p> et </p>. Un saut de ligne est matérialisé par une balise isolée <br>. Les textes en gras sont encadrés par les balises <strong> et </strong>. Pour qu'elles ne soient pas neutralisées par l'action récursive que nous allons enclencher avec les expressions régulières, nous proposons de remplacer temporairement les symboles aux extrémités (< et >), sur ces balises spécifiques. Ce sont eux qui signent en effet la séquence remarquable à déceler.
- A la suite du code, ajouter les instructions VBA suivantes :
...
chaine = Replace(chaine, "<p>", "^|br|^")
chaine = Replace(chaine, "</p>", "^|br|^")
chaine = Replace(chaine, "<br>", "^|br|^")
chaine = Replace(chaine, "<strong>", "^|strong|^")
chaine = Replace(chaine, "</strong>", "^|/strong|^")
...
Comme vous le constatez, nous choisissons des caractères dont l'assemblage peut difficilement déjà exister dans le contenu pour créer des repères immanquables. Nous choisissons l'accent circonflexe associé à la barre verticale (^|) pour la balise ouvrante et son inverse (|^) pour la balise fermante. C'est bien sûr la
fonction VBA Replace qui opère ces remplacements de masse sur tout le contenu qui est passé en
paramètre de la fonction par le biais de la
variable chaine.
Supprimer toutes les balises restantes
Grâce à l'
objet expReg et ses nouvelles facultés, nous allons maintenant pouvoir initialiser l'
objet motif pour lancer le
processus de recherche et de
remplacement de ces
séquences remarquables restantes. Mais attention, cette exécution doit se faire en boucle pour parcourir toutes les séquences dans l'intégralité du contenu importé.
- A la suite du code, ajouter la ligne VBA et la boucle suivante :
Set motif = expReg.Execute(chaine)
Do While motif.Count > 0
compteur = compteur + 1
chaine = expReg.Replace(chaine, "")
Set motif = expReg.Execute(chaine)
DoEvents
etat.Value = Int(compteur / 5)
If compteur > 500 Then Exit Do
Loop
Nous exploitons la
méthode Exécute de notre objet sur le contenu récupéré (chaine) pour initialiser (Set) la
variable motif. Cette action a pour effet de déceler la première séquence remarquable, soit la première
balise Html toujours en place. C'est la raison pour laquelle nous engageons une boucle destinée à les parcourir toutes. C'est la
propriété héritée Count qui renseigne sur leur nombre dans le flux. A chaque passage, nous incrémentons la
variable compteur (compteur = compteur + 1). Nous exploitons alors la
méthode Replace de l'
objet expReg pour supprimer la balise ("") en cours. Puis, dans ce processus récursif, nous relançons la recherche (Execute) pour trouver la prochaine balise à supprimer. La
fonction DoEvents permet de temporiser le processus pour rendre la main à de potentielles actions de l'utilisateur.
Il existe une
barre de progression en haut à droite du formulaire. Il s'agit d'un
contrôle ActiveX. Son nom est
etat. Nous souhaitons traiter jusqu'à 500 balises Html, pas au-delà (If compteur > 500 Then Exit Do). Or la valeur maximale d'une barre de progression est de 100 unités pour 100%. Nous prélevons donc la partie entière de la variable de boucle (Int(compteur / 5)) pour faire avancer la barre en corrélation et rendre compte de l'état d'avancement du processus de nettoyage en temps réel.
Réparer les balises préservées
Pour terminer, nous ne devons pas oublier de réhabiliter les quelques
balises Html que nous avons choisies de préserver grâce aux repères immanquables que nous avons glissés dans le flux. Et pour cela, c'est encore une fois la
fonction VBA Replace qui est à l'honneur.
- A la suite du code VBA, ajouter les instructions suivantes :
...
chaine = Replace(Replace(chaine, "^|", "<"),"|^", ">")
traiter = chaine
Set motif = Nothing
Set expReg = Nothing
...
Nous replaçons donc les symboles des balises. Nous affectons le contenu ainsi retraité (chaine) à la fonction (traiter) qui va donc pouvoir retourner le résultat de ses travaux à la procédure appelante. Cet appel reste à faire. Puis et classiquement, nous détruisons les deux variables objets (Nothing) qui ne sont plus utilisées, pour libérer la mémoire.
Bien sûr, cette fonction de traitement doit être appelée par la procédure récupérant le contenu du Web, après la ligne que nous avons insérée en début de formation pour restreindre le contenu à traiter.
- Dans la procédure trouver_Click, ajouter l'appel suivant :
...
article = objFlux.ReadText()
article = Mid(article, InStr(1, article, "</h2>") + 5)
article = traiter(article)
contenu.Value = article
...
Maintenant, si vous enregistrez les modifications, que vous exécutez le formulaire, que vous tapez les mêmes mots clés et que vous cliquez sur le bouton Trouver, la barre de progression rend compte de l'avancement et vous remarquez que vous récupérez le même contenu utile que précédemment à quelques détails près. La balise <time... qui encadrait la date de naissance et compliquait la lecture, a disparu. Les sauts de ligne sont conservés malgré la suppression des balises Html pour garder un document aéré. Et si celui-ci proposait des attributs de mise en forme en gras, ils seraient visibles.
Maintenant, si vous tapez d'autres mots clés de recherche comme
Puy du Fou, vous avez le plaisir de constater que toutes les informations demandées sont rapidement rapatriées en bonne et due forme sur le
formulaire Access.