samedi 27 août 2022

Raspberry Pi Pico W: lire le contenu d'une page web (Micropython)

Dans cet article, nous utilisons un Raspberry Pi Pico W (programmé en Micropython) pour lire le contenu d'une page web. 


La page web que j'ai choisie à titre d'exemple sera... le blog "Électronique en Amateur" ! Nous allons faire en sorte que le Raspberry Pi Pico visite le blog et y trouve le titre de la publication la plus récente. Vous pourrez ensuite modifier ce script pour que votre Raspberry Pi Pico W affiche les conditions météorologique, les cours de la bourse, les résultats de votre équipe sportive préférée, etc.

La bibliothèque "urequests" de Micropython est spécialement conçue pour naviguer sur le web. On accède à la page web de cette façon:

page_web = urequests.get("http://electroniqueamateur.blogspot.com")

Tout le contenu html de la page est alors placé dans la chaîne de caractères (string) "page_web.text". 

Il reste ensuite ensuite à extraire de cette longue chaîne de caractères les informations qui nous intéressent. 

En affichant le code source de la page web, j'ai remarqué que le titre d'un article du blog est toujours précédé de ce tag html:

<h3 class='post-title entry-title' itemprop='name'>

Donc, en utilisant la méthode find pour localiser cette sous-chaîne à l'intérieure de la chaîne complète...

    position = page_web.text.find("<h3 class='post-title entry-title' itemprop='name'>")
    extrait = page_web.text[position:position + 300]

... j'obtiens une chaîne de 300 caractères qui contient, entre autres choses, le titre de l'article le plus récent du blog (qui s'intitule, au moment où j'écris ces lignes, "Dans un blog près de chez vous (24)"):


Mon extrait contient toutefois une grande quantité de caractères qui ne sont pas pertinents. On peut facilement omettre quelques dizaines de caractères au début de la chaîne. Ici, par exemple, ma chaîne débute 80 caractères plus loin:

    position = page_web.text.find("<h3 class='post-title entry-title' itemprop='name'>")
    extrait = page_web.text[position + 80:position + 300]

Le contenu de la variable "extrait" est maintenant:


L'url qui précède le titre de l'article n'aura pas toujours la même longueur, mais on peut détecter où il se termine en recherchant le caractère ">":

    position = extrait.find(">")
    extrait = extrait[position + 1:]

Le contenu de la variable "extrait" est maintenant:


...et il ne reste plus qu'à rechercher le caractère "<" pour retirer le texte superflu qui suit le titre de l'article:

    position = extrait.find("<")
    extrait = extrait[:position]

Maintenant, la variable "extrait" ne comporte plus que le titre désiré:



Voici le script complet:

-
'''
Lecture d'une page web par le Raspberry Pi Pico W
(Le Raspberry Pi Pico W récupère le
titre du plus récent article publié
sur le blog "Électronique en Amateur")
Pour plus d'informations:
https://electroniqueamateur.blogspot.com/2022/08/raspberry-pi-pico-w-lire-le-contenu.html
'''
import network
import urequests
import time
# à remplacer par le nom du réseau wifi et le mot de passe
ssid = 'nom_du_reseau_wifi'
password = 'mot_de_passe'
# connexion au réseau wifi
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)
max_wait = 10 # si pas connecté en 10 secondes, on abandonne
print('Attente de la connection', end='')
while max_wait > 0:
if wlan.status() < 0 or wlan.status() >= 3:
break
max_wait -= 1
print('.', end='')
time.sleep(1)
print ('')
if wlan.status() != 3:
raise RuntimeError('Echec de la connexion a ' + ssid)
else:
print('Connexion reussie')
status = wlan.ifconfig()
print('')
# on récupère la page web
print("Le plus recent article publie sur le blog est:")
page_web = urequests.get("http://electroniqueamateur.blogspot.com")
# extraction de l'information recherchée
position = page_web.text.find("<h3 class='post-title entry-title' itemprop='name'>")
extrait = page_web.text[position + 80:position + 300]
position = extrait.find(">")
extrait = extrait[position + 1:]
position = extrait.find("<")
extrait = extrait[:position]
print(extrait)
page_web.close()
-

... et le résultat affiché dans la console:



À lire également:

Aucun commentaire:

Enregistrer un commentaire