BeautifulSoup
Utilisation de BeautifulSoup pour parcourir des pages web :
- installation par yum
yum install python-beautifulsoup4
- exemple de script python qui extrait d'un fichier source livetrail, le classement d'une compétion et produit un fichier csv (récuperable par kikourou)
Ps :
- il faut récupèrer le classement de la course (afficher le source de la page)
- copier-coller tout ça dans un fichier et supprimmer quelques lignes pourries en début.
On obtient un truc du genre
Fichier source modifié pour être compréhensible par BeautifulSoup :
<classement> <c class="1" doss="737" nom="LE PROVOST" prenom="Florentin" club="endurance shop" pays="France" a3="FRA" cio="FRA" cod="FR" p="FR" cat="SE H" classcat="1" tps="14:08:41" ecart="00:00:00" ></c> <c class="2" doss="813" nom="TRIVEL" prenom="damien" club="Team Hoka" pays="France" a3="FRA" cio="FRA" cod="FR" p="FR" cat="V1 H" classcat="1" tps="14:30:39" ecart="00:21:58" ></c> <c class="3" doss="829" nom="VERMEULEN" prenom="kevin" club="" pays="France" a3="FRA" cio="FRA" cod="FR" p="FR" cat="SE H" classcat="2" tps="15:10:49" ecart="01:02:08" ></c> </classement></d>
- il suffit de lancer le script ci-dessous afin qu'il produise le fichier csv
#!/usr/bin/python -u # # coding: utf8 # from bs4 import BeautifulSoup # # format csv = class;temps;nom;cat;sexe;club #globales BOLD = "\033[1m" RESET = "\033[0;0m" fic='/home/paulo/dropbox/resultatEB85.html' # def main(): f = open(fic) soup = BeautifulSoup(f, from_encoding='utf8') with open('/tmp/eb85.csv','w')as out: out.write('class;temps;nom;cat;sexe;club\n') for c in soup.find_all('c'): ligne = u'{};{};{} {};{};{};{};\n'.format(int(''.join(c.get('class'))), c.get('tps'), c.get('nom'), c.get('prenom'), c.get('cat').split()[0], c.get('cat').split()[1], c.get('club')) print u'{};{};{} {};{};{};{};'.format(int(''.join(c.get('class'))), c.get('tps'), c.get('nom'), c.get('prenom'), c.get('cat').split()[0], c.get('cat').split()[1], c.get('club')) out.write(ligne.encode('utf8')) return 0 if __name__ == '__main__': main()
Ps :
On peut aussi récupérer directement le fichier sur le web.
Dans ce cas le code est légèrement modifié
#a rajouter dans le code ci-dessus from urllib2 import urlopen import bs4 as BeautifulSoup html = urlopen('http://www.d8.tv/d8-series/pid6654-d8-longmire.html').read() soup = BeautifulSoup.BeautifulSoup(html) #
Code à bricoler en fonction du fichier d'entre/sortie
En vrac :
# selection d'une table avec un id='ctnResultats' table = soup.find('table', id='ctnResultats') # recup du lien dans un 'td' avec une class 'datasCMP0' print(soup.select('td.datasCMP0 a[href]')) # pacours toutes les 'td' qui on une classe 'listResCom', on peut rajouter pas mal de cle... for td in table.findAll('td', {'class':'listResCom'}) print td[0].attrs # renvoit tous les attributs du premier 'td' # liste qui contient toutes les td qui ont une classe datasCMP0 ou datasCMP1 lst = soup.findAll('td', {'class': ['datasCMP0', 'datasCMP1']})
Source :
- https://stackoverflow.com/questions/44392598/python-beautiful-soup-target-tag-only-within-another
- http://akul.me/blog/2016/beautifulsoup-cheatsheet/
- https://stackoverflow.com/questions/11331071/get-class-name-and-contents-using-beautiful-soup