IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau/Web Python Discussion :

Problème ordonnement webscrapping bs4 et request


Sujet :

Réseau/Web Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2017
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Problème ordonnement webscrapping bs4 et request
    Salut à tous !
    Je suis en train de réaliser un projet dont le but est de récupérer les données de matchs nba à partir du site ESPN , à l'aide des modules beautifulsoup,request et panda pour ordonner (je précise que ce n'est qu'à but ludique). J'ai trouvé ce code , qui permet de récupérer et d'ordonner les différentes teams , leurs abréviations et leurs liens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    import pandas as pd
    import requests  #acceder à l'url
    from bs4 import BeautifulSoup #scrapper data
     
     
    url = 'http://espn.go.com/nba/teams'  
    r = requests.get(url)  
     
    soup = BeautifulSoup(r.text)
    tables = soup.find_all('ul', class_='medium-logos') 
     
    teams = []
    Abréviation = []
    prefix_2 = []
    teams_urls = []
    for table in tables:
        lis = table.find_all('li')
        for li in lis:
            info = li.h5.a
            teams.append(info.text)
            url = info['href']
            teams_urls.append(url)
            Abréviation.append(url.split('/')[7])
            prefix_2.append(url.split('/')[8])
     
     
    dic = {'url': teams_urls, 'prefix_2': prefix_2, 'Abréviation': Abréviation}
    teams = pd.DataFrame(dic, index=teams)
    teams.index.name = 'team'
    print(teams)
    Ici , tout fonctionne . Mais lorsque que je réécris un programme sous le même modèle , pour reprendre leurs résultats (type "vs ....", "W/L" ,"score") , je n'arrive pas à ordonner les données avec panda , puisque la structure du site web ne me permet pas de séparer ces données de résultat que j'ai cité dans mes parenthèses , car ce n'est que du texte . J'aimerai donc pouvoir ordonner ces données sur le même type que le précédent programme . Voici le programme qui permet de récupérer les données voulues , celles que je souhaite ordonner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    import pandas as pd
    import requests  #acceder à l'url
    from bs4 import BeautifulSoup #scrapper data
     
     
    url = 'http://www.espn.com/nba/team/schedule/_/name/bos/boston-celtics'  
    r = requests.get(url)  
     
    soup = BeautifulSoup(r.text)
    tables = soup.find_all('ul', class_='game-schedule') 
     
    résultat = []
    for table in tables:
        lis = table.find_all('li')
        for li in lis:
            info = li
            résultat.append(info.text)
     
    print(résultat)
    J'espère que vous avez compris mon problème , et merci de votre aide!

  2. #2
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Bah pour ordonner des données, faut savoir identifier ce que contient ton tableau.

    De la façon dont tu as construit ton résultat (on ne met pas de caractère accentué dans les noms de variables), ça va être difficile de pouvoir ordonner quoi que ce soit.

    Il faut que tu construises ton résultat autrement, en utilisant une liste de dict.
    Pour les clés de ce dict, la solution serait d'utiliser les noms de class des items li, tout du moins en s'appuyant dessus, attention toutefois aux doublons.

    Ensuite une fois ton dict créer, il suffit d'utiliser sorted en spécifiant le paramètre key avec un callback à ta sauce ou encore en utilisant la méthode itemgetter() qu module operator
    Le temps ronge l'amour comme l'acide.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2017
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci de ta réponse !
    Oui , je compte tout inscrire dans un dictionnaire. J'ai bien sûr essayé de choisir les classes spécifiques à chaque information voulue , cependant , je n'ai plus de matière pour chercher entre les balises "li" (je ne sais pas si vous m'avez compris , le code sera plus clair :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    import pandas as pd
    import requests  
    from bs4 import BeautifulSoup 
     
     
    url = 'http://www.espn.com/nba/team/schedule/_/name/bos/boston-celtics'  
    r = requests.get(url)  
     
    soup = BeautifulSoup(r.text)
    tables = soup.find_all('ul', class_='game-schedule') 
     
    résultat = []
    for table in tables:
        lis = table.find_all('li')
        for li in lis:
            info = li
            résultat.append(info.text)
     
    print(résultat)
    se transforme en ça (pour seulement savoir ici , le "vs" ou le "@") :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    import pandas as pd
    import requests  
    from bs4 import BeautifulSoup 
     
     
    url = 'http://www.espn.com/nba/team/schedule/_/name/bos/boston-celtics'  
    r = requests.get(url)  
     
    soup = BeautifulSoup(r.text)
    tables = soup.find_all('li', class_='game-status') 
     
    location = []
    for table in tables:
        lis = table.find_all('li')
        for li in lis:
            info = li
            location.append(info.text)
     
    print(location)
    Et ici , je ne sais pas quoi écrire dans le "for table in tables" , puisque je suis déjà à la plus petite balise possible , je ne peux pas chercher plus loin (comme chercher les "li" dans le "ul")


    Encore une fois , je ne sais pas si c'est très clair , mais merci de votre aide !

  4. #4
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    J'ai zieuter le html, et y'a bien moyen de construire facilement un dict en s’appuyant sur les classes des balises li.

    Je suis parti du principe de récupérer uniquement les matchs joués, donc avec un score.

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    url = 'http://www.espn.com/nba/team/schedule/_/name/bos/boston-celtics'  
     
    r = requests.get(url)  
    soup = BeautifulSoup(r.text)
     
    listes = soup.find_all('ul', class_='game-schedule') 
     
    resultats = []
    i = 0
    for liste in listes :
     
        if not i % 2 :
            resultat = {}
     
        for item in liste.find_all('li') :
            if item.text :
                if 'class' in item.attrs :
                    cle = str(item.attrs['class'][-1])
                    if cle in ('win', 'loss') :
                        cle = 'resultat'
                    resultat[cle] = item.text 
     
        if i % 2 and 'score' in resultat.keys() :
            resultats.append(resultat)
        i += 1
     
    from operator import itemgetter
    import re
     
    print('Ordonné en 1er par les victoires, en 2nd par les défaites')
    for n in sorted(resultats, key=itemgetter('resultat'), reverse=True) :
        print(n)
     
    def differenceScores(item) :
        score = re.findall('\d+', item['score'])
        return abs(int(score[0]) - int(score[1]))
     
    print('Ordonné par les matchs aux scores les plus serrés')
    for n in sorted(resultats, key=differenceScores) :
        print(n)

    Je te laisse adapter comme tu souhaites.
    Le temps ronge l'amour comme l'acide.

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2017
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci de ta réponse rapide ! Je n'ai pas étudié la plupart de ce que tu as utilisé , voilà pourquoi je ne trouvais pas ! Ton programme fonctionne parfaitement , merci de ton aide , je vais me pencher dessus pour comprendre son fonctionnement . Bonne soirée

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2017
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Encore une question , à quoi sert le "%" ?

  7. #7
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    C'est l'opérateur modulo.
    Le temps ronge l'amour comme l'acide.

Discussions similaires

  1. Réponses: 3
    Dernier message: 01/07/2016, 19h47
  2. Problème Requête POST avec module Request
    Par Lerenn dans le forum Réseau/Web
    Réponses: 0
    Dernier message: 09/05/2013, 00h00
  3. Régler le problème de l'erreur 414 Request-URI too large
    Par leaderchips dans le forum Apache
    Réponses: 3
    Dernier message: 24/06/2011, 16h23
  4. problème upload d'images + bad request
    Par s.n.a.f.u dans le forum Développement
    Réponses: 1
    Dernier message: 12/06/2008, 22h21
  5. [jsp]problème avec request.getParameter(...)!
    Par fadoua dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 01/09/2003, 13h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo