Problème d'itération beautifulSoup

Python 3x

Le problème exposé dans ce sujet a été résolu.

bonjour à tous

Je découvre les joies du langage Python afin de développer mon site Web

Après avoir vu de nombreux tutos ainsi que les différentes documentations concernant BeautifulSoup, j’arrive à récupérer les infos souhaitées sur la 1ere ligne du tableau seulement. J’ai bien compris que pour avoir toutes les lignes du tableau, il faut faire une itération avec "for". C’est la où je bloque.

La 1ere ligne est bien trouvée mais à la 2eme, la valeur est "none".

Voici mon code ci-dessous :



import requests
from bs4 import BeautifulSoup


url = 'https://www.futbin.com/21/players'
response = requests.get(url)
if response.ok:
    soup = BeautifulSoup(response.text,'lxml')
    table = soup.find('tbody')
    trs = soup.find('tr')
    tds = trs.findAll('td')
    for td in tds : 
        imgPlayer = td.find('img', class_='player_img')
        imgPlayerLink = imgPlayer['data-original']
        name = td.find('a', class_='player_name_players_table')
        detail = td.find('span', class_= 'players_club_nation')
        club = detail.find('img')
        clubLink = club['src']
        pays = club.find_next('img')
        paysLink = pays['src']
        league = pays.find_next('img')
        leagueLink = league['src']
        note = name.find_next('td')
        position = note.find_next('td')
        version = position.find_next('td')
        prix = version.find_next('td')
        
        print(imgPlayerLink)
        print(name.text)
        print(clubLink)
        print(paysLink)
        print(leagueLink)
        print(note.text)
        print(position.text)
        print(version.text)
        print(prix.text)

J’espère sincèrement que vous pourrez m’aider.

En attendant une réponse, je vous remercie par avance

+0 -0

Salut merci de ta réponse Voici ce que me renvoie le terminal :

File "c:\wamp64\www\fut4fun\recup_bdd copy.py", line 16, in <module>
   imgPlayerLink = imgPlayer['data-original']
TypeError: 'NoneType' object is not subscriptable
```python  

  imgPlayerLink = imgPlayer['data-original'] vaut none. 

 Du coup la boucle s'arrête. Quelle condition pourrais-je passer ?
 
 Merci d'avance
 

vu l’erreur, c’est plutôt imgPlayerqui vaut None
comme tu ne l’utilise pas vraiment, un simple test peut résoudre le problème

url = 'https://www.futbin.com/21/players'
response = requests.get(url)
if response.ok:
    soup = BeautifulSoup(response.text,'lxml')
    table = soup.find('tbody')
    trs = soup.find('tr')
    tds = trs.findAll('td')
    for td in tds : 
        imgPlayer = td.find('img', class_='player_img')
        if imgPlayer:
            imgPlayerLink = imgPlayer['data-original']
+0 -0

Merci pour vos réponses Voici un extrait du code html qui nous interesse :

<tbody>
<tr class="player_tr_1" data-url="/21/player/28995/pele">
<td class="table-row-text row" style="text-align: left;">
<div class="d-inline">
<img alt="Pelé 99" class="player_img player_right_curve lazy-main-player form rating ut21 icon_moment gold rare" data-original="https://cdn.futbin.com/content/fifa21/img/players/p246525.png?v=22" src="/design/img/blank_player.png" style="padding: 0;"/>
</div>
<div class="d-inline pt-2 pl-3">
<div>
<a class="player_name_players_table" href="/21/player/28995/pele">Pelé</a>
</div>
<div>
<span class="players_club_nation" style="display: inline-block;">
<a data-original-title="FUT 21 ICONS" data-placement="top" data-toggle="tooltip" href="/21/players?page=1&amp;club=112658"><img src="https://cdn.futbin.com/content/fifa21/img/clubs/112658.png" style="width:20px;"/></a>
<a data-original-title="Brazil" data-placement="top" data-toggle="tooltip" href="/21/players?page=1&amp;nation=54"><img src="https://cdn.futbin.com/content/fifa21/img/nation/54.png" style="width: 24px;"/></a><a data-original-title="Icons" data-placement="top" data-toggle="tooltip" href="/21/players?page=1&amp;league=2118"><img src="https://cdn.futbin.com/content/fifa21/img/league/2118.png" style="width: 24px;"/></a>
</span>
</div>
</div>
</td>
<td><span class="form rating ut21 icon_moment gold rare">99</span></td>
<td class="">CF</td>
<td class="mobile-hide-table-col">Icon Moment</td>
<td><span class="ps4_color font-weight-bold">4.6M <img alt="c" class="small-coins-icon" src="/design/img/coins_bin.png"/></span> </td>
<td>5<i class="icon-star-full stars-" style="font-size: 10px;"></i></td>
<td>4<i class="icon-star-full stars" style="font-size: 10px;"></i></td>
<td><span class="high_wr_text" style="font-weight: bold;">H</span> \ <span class="med_wr_text" style="font-weight: bold;">M</span></td>
<td><span class="badge success-color-dark stat_text_dark_green rounded p-2 font-weight-normal">97</span></td>
<td><span class="badge success-color-dark stat_text_dark_green rounded p-2 font-weight-normal">98</span></td>
<td><span class="badge success-color-dark stat_text_dark_green rounded p-2 font-weight-normal">95</span></td>
<td><span class="badge success-color-dark stat_text_dark_green rounded p-2 font-weight-normal">98</span></td>
<td><span class="badge orange darken-1 stat_text_orange rounded p-2 font-weight-normal">61</span></td>
<td><span class="badge yellow darken-2 stat_text_yellow rounded p-2 font-weight-normal">78</span></td>
<td>
<div> 173cm | 5'8"</div>
<div style="font-size: 12px; "> <a href="/21/players?page=1&amp;body_type=294"> Unique</a>  (70kg)</div>
</td>
<td>2662</td>
<td>527</td>
<td>2562</td>
</tr>
<tr class="player_tr_2" data-url="/21/player/30068/roberto-firmino">
<td class="table-row-text row" style="text-align: left;">
<div class="d-inline">
<img alt="Roberto Firmino 99" class="player_img player_right_curve lazy-main-player form rating ut21 fof_ptg gold rare" data-original="https://cdn.futbin.com/content/fifa21/img/players/p100865238.png?v=22" src="/design/img/blank_player.png" style="padding: 0;"/>
</div>
<div class="d-inline pt-2 pl-3">
<div>
<a class="player_name_players_table" href="/21/player/30068/roberto-firmino">Roberto Firmino</a>
</div>
<div>
<span class="players_club_nation" style="display: inline-block;">
<a data-original-title="Liverpool" data-placement="top" data-toggle="tooltip" href="/21/players?page=1&amp;club=9"><img src="https://cdn.futbin.com/content/fifa21/img/clubs/9.png" style="width:20px;"/></a>   
<a data-original-title="Brazil" data-placement="top" data-toggle="tooltip" href="/21/players?page=1&amp;nation=54"><img src="https://cdn.futbin.com/content/fifa21/img/nation/54.png" style="width: 24px;"/></a><a data-original-title="Premier League" data-placement="top" data-toggle="tooltip" href="/21/players?page=1&amp;league=13"><img src="https://cdn.futbin.com/content/fifa21/img/league/13.png" style="width: 24px;"/></a>
</span>
</div>
</div>
</td>
<td><span class="form rating ut21 fof_ptg gold rare">99</span></td>
<td class="">ST</td>
<td class="mobile-hide-table-col">FOF PTG</td>
<td><span class="ps4_color font-weight-bold">1.05M <img alt="c" class="small-coins-icon" src="/design/img/coins_bin.png"/></span> </td>
<td>5<i class="icon-star-full stars-" style="font-size: 10px;"></i></td>
<td>4<i class="icon-star-full stars" style="font-size: 10px;"></i></td>
<td><span class="high_wr_text" style="font-weight: bold;">H</span> \ <span class="high_wr_text" style="font-weight: bold;">H</span></td>
<td><span class="badge success-color-dark stat_text_dark_green rounded p-2 font-weight-normal">95</span></td>
<td><span class="badge success-color-dark stat_text_dark_green rounded p-2 font-weight-normal">96</span></td>
<td><span class="badge success-color-dark stat_text_dark_green rounded p-2 font-weight-normal">96</span></td>
<td><span class="badge success-color-dark stat_text_dark_green rounded p-2 font-weight-normal">99</span></td>
<td><span class="badge yellow darken-2 stat_text_yellow rounded p-2 font-weight-normal">72</span></td>
<td><span class="badge success-color-dark stat_text_dark_green rounded p-2 font-weight-normal">92</span></td>
<td>
<div> 181cm | 5'11"</div>
<div style="font-size: 12px; "> <a href="/21/players?page=1&amp;body_type=315"> Unique</a>  (76kg)</div>
</td>
<td>1827</td>
<td>550</td>
<td>2642</td>
</tr>

Il y a en tout 18 <tr> sur la page (j’ai besoin de tous les récupérer) et il y a 18 <td> (je souhaite récupérer seulement les 7 que j’ai besoin

Bonjour à tous

Merci pour votre aide, j’ai réussi a récupéré les données que je voulais. Maintenant j’aimerai l’écrire dans un csv ou json Le problème est qu’il m’inscrit seulement la dernière ligne avec la methode 'w' Avec la méthode 'a’, il m’inscrit bien toutes les lignes mais n’efface pas les précédentes et ce n’est pas ce que je veux Voici mon code :


import requests
from bs4 import BeautifulSoup
import csv
import pandas as pd
import json
for i in range(5):
    url = 'https://www.futbin.com/21/players?page='+ str(i) +'&ps_price=1100-5000&version=gold_rare&sort=likes&order=desc'
    response = requests.get(url)
    if response.ok:
        soup = BeautifulSoup(response.text,'lxml')
        tbody = soup.find('tbody')
        extracted = tbody.findAll('tr', {'class': re.compile('player_tr_\d+')})
        for td in extracted :
            name = td.find('a', class_='player_name_players_table')
            #print(name.text)
            detail = td.find('span', class_= 'players_club_nation')
            if detail:
                club = detail.find('img')
            clubLink = club['src']
            #print(clubLink)
            pays = club.find_next('img')
            paysLink = pays['src']
            #print(paysLink)
            league = pays.find_next('img')
            leagueLink = league['src']
            #print(leagueLink)
            imgPlayer = td.find('img', class_='player_img')
            if imgPlayer:
                imgPlayerLink = imgPlayer['data-original']
            #print(imgPlayerLink)
            note = name.find_next('td')
            #print(note.text)
            position = note.find_next('td')
            #print(position.text)
            version = position.find_next('td')
            #print(version.text)
            prix = version.find_next('td')
            #print(prix.text)
            


players = [
    name.text,
    clubLink, 
    paysLink,
    leagueLink,
    imgPlayerLink,
    note.text,
    position.text,
    version.text,
    prix.text ]
#print(players)
            
with open('data.json', 'w+') as outfile:
    json.dump(players, outfile)     


Je dois pas être loin de la solution mais je ne trouve pas

Si quelqu'un voit l'erreur

Merci d'avance
+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte