BeautifulSoup

Rédigé par Paulo Aucun commentaire
Classé dans : Python Mots clés : python, beautifulsoup, bs

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



 

Les commentaires sont fermés.