AttributeError: у объекта 'NoneType' нет атрибута 'find_all'

Я использую слегка отредактированный код от Даниэля Родригеса. Я пытаюсь получить все данные по счетам NBA за 2014 год. Этот код состоит из двух предыдущих частей: первая захватывает все названия команд, а вторая - все игры для этих команд с идентификатором игры ESPN, датой, домашней командой., домашний счет, команда гостей и гости. Эти две части работали просто отлично.

Затем я пытаюсь запустить часть, которая захватывает все данные boxscore для игр из идентификатора игры. Это работает для части игр и затем остановится на игре почти случайно и выдаст ошибку:

AttributeError: у объекта 'NoneType' нет атрибута 'find_all'

Я говорю случайно, потому что я запускаю один и тот же код снова и снова, и он никогда не останавливается на одном и том же счете. Каждый раз он выдает ошибку на разных счетах.

Вот код (строка **, где происходит ошибка):

import numpy as np
import pandas as pd
import requests
import time
from bs4 import BeautifulSoup
import os
os.chdir('C:\Users\steven2r\Documents\Python')

games = pd.read_csv('games.csv').set_index('id')
BASE_URL = 'http://espn.go.com/nba/boxscore?gameId={0}'

request = requests.get(BASE_URL.format(games.index[0]))

table = BeautifulSoup(request.text).find('table', class_='mod-data')
heads = table.find_all('thead')
headers = heads[0].find_all('tr')[1].find_all('th')[1:]
headers = [th.text for th in headers]
columns = ['id', 'team', 'player'] + headers
bad_downloads = []

players = pd.DataFrame(columns=columns)

def get_players(players, team_name):
    array = np.zeros((len(players), len(headers)+1), dtype=object)
    array[:] = np.nan
    for i, player in enumerate(players):
        cols = player.find_all('td')
        array[i, 0] = cols[0].text.split(',')[0]
        for j in range(1, len(headers) + 1):
            if not cols[1].text.startswith('DNP'):
                array[i, j] = cols[j].text

    frame = pd.DataFrame(columns=columns)
    for x in array:
        line = np.concatenate(([index, team_name], x)).reshape(1,len(columns))
        new = pd.DataFrame(line, columns=frame.columns)
        frame = frame.append(new)
    return frame

for index, row in games.iterrows():
    print(index)
    request = requests.get(BASE_URL.format(index))
    table = BeautifulSoup(request.text).find('table', class_='mod-data')

    if table == []:
        print index, 'bad'
        bad_downloads.append(index)
    else:
        heads = table.find_all('thead')
        bodies = table.find_all('tbody')

        team_1 = heads[0].th.text
        team_1_players = bodies[0].find_all('tr') + bodies[1].find_all('tr')
        team_1_players = get_players(team_1_players, team_1)
        players = players.append(team_1_players)

        team_2 = heads[3].th.text
        team_2_players = bodies[3].find_all('tr') + bodies[4].find_all('tr')
        team_2_players = get_players(team_2_players, team_2)
        players = players.append(team_2_players)

players = players.set_index('id')
print(players)
players.to_csv('players.csv')

print bad_downloads

1 ответ

См. Проблемы с анализом данных NBA Boxscore с BeautifulSoup. Кажется, BeautifulSoup не полностью совместим с ESPN. Ссылка выше дает альтернативное решение.

Другие вопросы по тегам