【问题标题】:maximum recursion error Python最大递归误差 Python
【发布时间】:2013-11-01 00:31:59
【问题描述】:

我正在尝试从 ESPN.com 上抓取一些评分并将它们放入 Pandas DataFrame 中。我过去以同样的方式做过类似的事情,没有任何问题。但是在这种情况下,当我尝试保存 DataFrame 时出现此错误。

RuntimeError: 调用 Python 对象时超出最大递归深度

我在尝试将其保存为 hdf5 表时遇到了类似的错误。

即使这个 sn-p 给出了同样的错误。我很困惑为什么要这样做?跟功能有关系吗?

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 Traceback(最近一次调用最后一次) 在 () ----> 1 testScrape.save('testScrape')

C:\Python27\lib\site-packages\pandas\core\generic.pyc in save(self, path) 26 27 def保存(自我,路径): ---> 28 com.save(自我,路径) 29 30 @类方法

C:\Python27\lib\site-packages\pandas\core\common.pyc in save(obj, path) 第1562章 1563 尝试: -> 1564 pickle.dump(obj,f,协议=pickle.HIGHEST_PROTOCOL) 1565终于: 第1566章

RuntimeError: 调用 Python 对象时超出最大递归深度

print data

返回

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

【问题讨论】:

  • 一般来说,它有助于显示完整的回溯,或者至少显示哪一行引发了异常,而不仅仅是异常的文本。
  • 我在您的代码中看不到任何显式递归。能否请您发布完整的堆栈跟踪?
  • 另外,请修正缩进以使您的代码可运行。
  • 奇怪的是你可以做 DataFrame(testScrape.to_dict('foo')).save(),这看起来像一个奇怪的错误,最好将它报告为 github 问题。
  • 等一下,我明白了。 awayTeam 不是 str,它是一个自包含对象。让我写一个更详细的答案。

标签: python pandas


【解决方案1】:

pickle.dump 的这个异常通常意味着您正在尝试腌制一个包含自身的对象(直接或间接)。

但是什么对象包含自己?当你print他们全部出来时,他们看起来都很好。

这是awayTeam 这是bs4.element.NavigableString,您可以通过以下方式获得:

awayTeam = awayQTRScores[0]

你可能不会仅仅从print awayTeam 甚至print repr(awayTeam) 注意到它,因为NavigableStringunicode 的子类并且没有定义自定义__str____repr__,所以它打印出来就像一个字符串。

但它也没有定义自定义pickler,所以它使用默认pickler。一般来说,bs4 对象不是为腌制而设计的,而且其中许多不能腌制。特别是,NavigableString 是一个间接包含自身的对象。正如文档所说:

如果你想在 Beautiful Soup 之外使用NavigableString,你应该在它上面调用unicode(),把它变成一个普通的 Python Unicode 字符串。如果您不这样做,您的字符串将携带对整个 Beautiful Soup 解析树的引用,即使您已使用完 Beautiful Soup。

当然,解析树包含对字符串的引用,等等。所以,这种类型永远不能被腌制。

解决方案很简单。你想要一个普通的旧 unicode 字符串,而不是 NavigableString,所以你可以这样做:

awayTeam = unicode(awayQTRScores[0])

【讨论】:

  • 谢谢!我正在使用 Python 3.6.x 并环绕 str(awayQTRScore[0]) 成功了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
相关资源
最近更新 更多