【问题标题】:AttributeError: 'NoneType' object has no attribute 'find_all'AttributeError:“NoneType”对象没有属性“find_all”
【发布时间】:2015-02-12 20:00:12
【问题描述】:

我正在使用 Daniel Rodriguez 的稍微修改过的代码。我正在尝试获取 2014 年以来的所有 NBA 盒子得分数据。此代码有两个先前部分:第一个获取所有球队名称,第二个获取具有 ESPN 比赛 ID、日期、主队的球队的所有比赛,主场比分,客场球队和客场比分。这两个部分工作得很好。

然后我尝试运行从游戏 id 获取游戏的所有 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

【问题讨论】:

  • 你在一个字符串上调用find_all。阅读文档
  • find 返回 None 而不是 [] 所以如果你想在没有匹配的时候明确地捕捉它会是 if table is None 但是你有这么多的 find_all 是不可能知道是哪个导致的一个错误
  • 非常感谢帕德莱克!我试图弄清楚返回的值是什么。这现在有效。出于某种原因,一些盒子分数没有正确加载,而且每次都不是相同的!通过这种方式,我可以创建一个游戏 ID 列表,这些游戏 ID 不会通过并手动完成。不,感谢你 L3viathan,你没有帮助。
  • @monkeyswithguns,看看我刚才在这里添加的答案stackoverflow.com/questions/28447487/…

标签: python nonetype espn


【解决方案1】:

Problems Parsing NBA Boxscore Data with BeautifulSoup BeautifulSoup 似乎与 ESPN 不完全兼容。上面的链接提供了另一种解决方案。

【讨论】:

  • 这个问题可以通过使用不同的解析器来解决,所以这里不一定是同样的问题。对 html 和正则表达式的轻微更改也会中断
猜你喜欢
  • 1970-01-01
  • 2021-05-31
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 2022-06-17
相关资源
最近更新 更多