0

ESPN.com からいくつかのボックス スコアをスクレイピングして Pandas DataFrame に入れようとしています。私は過去に同様のことを同じ方法で問題なく行ってきました。ただし、この場合、DataFrame を保存しようとすると、このエラーが発生します。

RuntimeError: Python オブジェクトの呼び出し中に最大再帰深度を超えました

hdf5 テーブルとして保存しようとすると、同様のエラーが発生します。

このスニペットでも同じエラーが発生します。なぜこれを行っているのか、かなり混乱していますか?機能と関係がありますか?

url = 'http://espn.go.com/nba/boxscore?gameId=400278773'   
boxurl = urllib2.urlopen(url).read()
soup = BeautifulSoup(boxurl)

tables = soup.findAll('table')
lineScoreTable = tables[-2]
lineScoreRows = lineScoreTable.findAll('tr') 

def GetAwayQTRScores():
    scoreRow = lineScoreRows[1].findAll('td')
    awayQTRScores = []
    for x in scoreRow:
        scores =  x.string
        awayQTRScores.append(scores)
    return awayQTRScores  # returns list

 awayQTRScores = GetAwayQTRScores()

 awayTeam = awayQTRScores[0]
 awayQ1 = int(awayQTRScores[1])
 awayQ2 = int(awayQTRScores[2])
 awayQ3 = int(awayQTRScores[3])
 awayQ4 = int(awayQTRScores[4])
 awayOT1 = np.nan if len(awayQTRScores) < 7 else int(awayQTRScores[5])
 awayOT2 = np.nan if len(awayQTRScores) < 8 else int(awayQTRScores[6])
 awayOT3 = np.nan if len(awayQTRScores) < 9 else int(awayQTRScores[7])
 awayOT4 = np.nan if len(awayQTRScores) < 10 else int(awayQTRScores[8])



 data = {'AwayTeam' :[awayTeam],
    'AwayQ1' : [awayQ1],
    'AwayQ2' : [awayQ2],
    'AwayQ3' : [awayQ3],
    'AwayQ4' : [awayQ4],
    'AwayOT1' : [awayOT1],
    'AwayOT2' : [awayOT2],
    'AwayOT3' : [awayOT3],
    'AwayOT4' : [awayOT4]}


testScrape = pd.DataFrame(data)
testScrape.save('testScrape')

() 内の RuntimeError トレースバック (最新の呼び出しが最後) ----> 1 testScrape.save('testScrape')

C:\Python27\lib\site-packages\pandas\core\generic.pyc in save(self, path) 26 27 def save(self, path): ---> 28 com.save(self, path) 29 30 @クラスメソッド

C:\Python27\lib\site-packages\pandas\core\common.pyc in save(obj, path) 1562 f = open(path, 'wb') 1563 try: -> 1564 pickle.dump(obj, f, protocol=pickle.HIGHEST_PROTOCOL) 1565 最終的に: 1566 f.close()

RuntimeError: Python オブジェクトの呼び出し中に最大再帰深度を超えました

print data

戻り値

{'AwayTeam': [u'LAL'], 'AwayOT4': [nan], 'AwayQ4': [27], 'AwayQ3': [36], 'AwayQ2': [24], 'AwayQ1': [16 ], 'AwayOT1': [nan], 'AwayOT2': [nan], 'AwayOT3': [nan]}

4

1 に答える 1

8

pickle.dump からのこの例外は通常、それ自体を (直接または間接的に) 含むオブジェクトをピクルしようとしていることを意味します。

しかし、どのオブジェクトがそれ自身を含んでいますか? あなたがprintそれらをすべて出すとき、それらはすべてうまく見えます。

これawayTeamは This is abs4.element.NavigableStringであり、これを行うことで得られます:

awayTeam = awayQTRScores[0]

は のサブクラスであり、カスタムのorを定義していないため、単にprint awayTeamまたはからは気付かないかもしれません。そのため、文字列のように出力されます。print repr(awayTeam)NavigableStringunicode__str____repr__

ただし、カスタム ピックラーも定義しないため、デフォルトのピックラーが使用されます。一般に、bs4オブジェクトは pickle 化するようには設計されておらず、その多くは pickle 化できません。特に、NavigableStringそれ自体を間接的に含むオブジェクトです。ドキュメントが言うように:

NavigableStringBeautiful Soup の外部を使用する場合はunicode()、それを呼び出して通常の Python Unicode 文字列に変換する必要があります。そうしないと、 Beautiful Soup の使用が終わった後でも、文字列は Beautiful Soup 解析ツリー全体への参照を保持します。

もちろん、解析ツリーには文字列への参照が含まれています。そのため、この型はピクルできません。

解決策は簡単です。ではなく、普通の古いunicode文字列NavigableStringが必要だったので、これを行うだけです:

awayTeam = unicode(awayQTRScores[0])
于 2013-10-22T23:00:52.987 に答える