#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. Я действительно ценю это, спасибо вам за помощь