Объект «Нетип» не имеет атрибута «текст» | Beautifulsoup

#python

Вопрос:

Я только начал изучать веб-создание на python, и я хотел узнать, как очистить данные с веб-сайта НФЛ, чтобы показать всех игроков и их статистику, но я получил эту ошибку с помощью Beautifulsoup.

 import requests
from bs4 import BeautifulSoup

url = "https://www.pro-football-reference.com/years/2021/passing.htm"

r = requests.get(url)
soup = BeautifulSoup(r.text, 'html.parser')

league_table = soup.find('table', class_ = 'per_match_toggle sortable stats_table')

for name in league_table.find_all('tbody'):
    rows = name.find_all('tr')
    for row in rows:
        name = row.find('td', class_ = 'left').text.strip()
        yards = row.find_all('td', class_ = 'right')[7].text
        touchdowns = row.find_all('td', class_ = 'right')[8].text
        print("Name "   name   " Yards "   yards    " Touchdowns "   touchdowns)
 

Ошибка:

 name = row.find('td', class_ = 'left').text.strip()
 

Ответ №1:

Это происходит с тех пор find() , как может вернуться None , у которого, очевидно, нет атрибута text .

Это может произойти, когда элемент, который вы ищете, не существует или вы передаете неверный аргумент функции поиска.

Вы должны обернуть проблемный раздел try-except предложением или if else предложением, чтобы справиться с такими сценариями

Комментарии:

1. Большое вам спасибо, я выложу все это позже сегодня

Ответ №2:

Это происходит потому, что вы заметите сразу после Джеймса Уинстона ряд заголовков. Так что <tr> этот тег состоит из <th> тегов, а не <td> из тегов. Итак, он попадает в эту строку , и вы говорите .find('td') , что она не содержит, поэтому она возвращается None . Затем вы хотите получить текст из того, что вы получаете .text , из None чего получаете .

Поэтому вам нужно будет либо, как предлагалось в предыдущем посте, использовать логику try/except, либо логику, которая принимает только строки с <td> тегами.

Лично я бы просто использовал панд, чтобы захватить таблицу, удалить строки заголовка и повторить эти строки.

 import pandas as pd

url = "https://www.pro-football-reference.com/years/2021/passing.htm"
df = pd.read_html(url)[0]
df = df[df['Player'].ne('Player')]

for idx, row in df.iterrows():
    name = row['Player']
    yards = row['Yds']
    touchdowns = row['TD']
    print("Name "   name   " Yards "   yards    " Touchdowns "   touchdowns)
 

Комментарии:

1. Я действительно ценю это, спасибо вам за помощь