Parser une page web en python
Suite à mon petit script pour grapher la température via une clé usb sur le logiciel Munin, j’ai voulu rajouter la température extérieur au graphique.
Le but n’est pas de rajouter une clé USB mais d’aller prendre l’information sur un site internet.
Je vis à Strasbourg, en cherchant un peu j’ai trouvé ce site qui donne la température via une station météo toutes les 5 minutes, parfait pour mon utilisation !
Pour extraire l’information, c’est à dire la température la plus récente, j’ai vais utiliser la librairie python BeautifulSoup qui permet de parser des pages web.
Installation et utilisation
La documentation officiel est trés bien faite.
Pour un système Ubuntu / Debian :
$ apt-get install python-bs4
Pour tester la librairie je vous propose un petit exemple. ( Merci à apprendre-python.com et à son super tuto )
root@local:~# python
Python 2.7.9 (default, Mar 1 2015, 12:57:24)
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from bs4 import BeautifulSoup
>>> html_doc = """
... <html>
... <head>
... <title>Exemple</title>
... </head>
... <body>
... <p>Texte abc</p>
... <p>Texte 123</p>
... </body>
... </html>
... """
>>> masoupe = BeautifulSoup(html_doc)
>>> masoupe.find_all('p')
[<p>Texte abc</p>, <p>Texte 123</p>]
>>> masoupe.find_all('p')[0]
<p>Texte abc</p>
>>> masoupe.find_all('p')[1]
<p>Texte 123</p>
>>> masoupe.find_all('p')[0].get_text()
u'Texte abc'
>>> masoupe.find_all('p')[1].get_text()
u'Texte 123'
Les possibilités sont bien plus grandes avec cette librairie, je vous laisse les découvrir.
Extraire la température du site météo et la mettre en forme
Pour mon problème, après avoir lu le code source de la page on se rend compte qu’ il suffit de rechercher dans la page toutes les balises nobr et de prendre la 13éme qui correspond à la température la plus récente et d’en extraire seulement le chiffre
soup.find_all('nobr')[12].get_text()[:4]
le [:4] permet de n’afficher que les 4 premiers caractères de la chaîne.
Munin nécessite un chiffre avec des . et pas des virgules. Pour remplacer la virgule par un point :
Variable.replace(',','.')
Le script
J’ai donc recrée mon script en python pour afficher sur mon graphique la température intérieur grâce à la clé USB et la température extérieur récupérer sur le site.
#!/usr/bin/python
import commands
from bs4 import BeautifulSoup
from urllib2 import urlopen
import sys
if len(sys.argv) == 2 and sys.argv[1] == "autoconf":
print "yes"
elif len(sys.argv) == 2 and sys.argv[1] == "config":
print 'graph_title Temperature'
print 'graph_vlabel Celsius'
print 'graph_category sensors'
print 'graph_args --base 1000 -l 0'
print 'MeteoSTG.label Meteo STG Petite France'
print 'Temper.label Temperature Cave'
else:
html = urlopen('http://meteopetitefrance.fr/index.php?pg=tabjour')
soup = BeautifulSoup(html)
temp = soup.find_all('nobr')[12].get_text()[:4]
temp = temp.replace(',','.')
print 'MeteoSTG.value ' + temp
temp_bur = commands.getoutput('/usr/local/bin/temperv14 -c')
print 'Temper.value ' + temp_bur
1 réponse
[…] Parser une page web en python […]