AttributeError: объект «NoneType» не имеет атрибута «find_all»

Я использую слегка отредактированный код Даниэля Родригеса. Я пытаюсь получить все данные о счете NBA Box с 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

person monkeyswithguns    schedule 12.02.2015    source источник
comment
Вы вызываете find_all в строке. Читать документы   -  person L3viathan    schedule 12.02.2015
comment
find возвращает None, а не [], поэтому, если вы хотите явно поймать отсутствие совпадений, это будет if table is None, но у вас так много find_all, что невозможно сказать, какой из них вызывает ошибку.   -  person Padraic Cunningham    schedule 12.02.2015
comment
Большое спасибо, Падрайк! Я пытался выяснить, какое значение было возвращено. Это работает сейчас. По какой-то причине некоторые баллы не загружаются правильно, и они каждый раз не одни и те же! Таким образом, я могу создать список идентификаторов игр, которые не получаются, и сделать это вручную. Нет, спасибо тебе, L3viathan, ты был бесполезен.   -  person monkeyswithguns    schedule 12.02.2015
comment
@monkeyswithguns, посмотрите на ответ, который я только что добавил здесь анализ данных nba boxscore с помощью beautifulsoup"> stackoverflow.com/questions/28447487/   -  person Padraic Cunningham    schedule 13.02.2015


Ответы (1)


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

person Jonathan Epstein    schedule 12.02.2015
comment
Этот вопрос вполне можно было бы решить, используя другой синтаксический анализатор, поэтому здесь не обязательно та же проблема. Также небольшое изменение в html и регулярное выражение сломаются - person Padraic Cunningham; 12.02.2015