我试图从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')
Run Code Online (Sandbox Code Playgroud)
RuntimeError Traceback(最近一次调用last)in()----> 1 testScrape.save('testScrape')
保存中的C:\ Python27\lib\site-packages\pandas\core\generic.pyc(self,path)26 27 def save(self,path):---> 28 com.save(self,path)29 30 @classmethod
ob:C中的C:\ Python27\lib\site-packages\pandas\core\common.pyc(obj,path)1562 f = open(path,'wb')1563试试: - > 1564 pickle.dump(obj,f, protocol = pickle.HIGHEST_PROTOCOL)1565最后:1566 f.close()
RuntimeError:调用Python对象时超出了最大递归深度
print data
Run Code Online (Sandbox Code Playgroud)
回报
{'AwayTeam':[u'LAL'],'AwayOT4':[nan],'AwayQ4':[27],'AwayQ3':[36],'AwayQ2':[24],'AwayQ1':[16 ],'AwayOT1':[nan],'AwayOT2':[nan],'AwayOT3':[nan]}
pickle.dump中的这个例外通常意味着你试图挑选一个包含它自己的对象(直接或间接).
但是什么对象包含自己?当你print全部出局时,他们看起来都很好.
它awayTeam这是一个bs4.element.NavigableString,您可以通过这样得到:
awayTeam = awayQTRScores[0]
Run Code Online (Sandbox Code Playgroud)
您可能不会从公开print awayTeam或甚至注意到它print repr(awayTeam),因为NavigableString它是子类,unicode并且没有定义自定义__str__或__repr__,因此它就像字符串一样打印.
但它也没有定义自定义pickler,因此它使用默认的pickler.通常,bs4对象不是设计成酸洗的,而且很多都不能.特别是,NavigableString是一个间接包含自身的对象.正如文档所说:
如果你想使用
NavigableStringBeautiful Soup 的外部,你应该调用unicode()它将它变成一个普通的Python Unicode字符串.如果你不这样做,你的字符串将带有对整个Beautiful Soup解析树的引用,即使你已经使用了Beautiful Soup.
当然,解析树包含对字符串的引用,等等.因此,这种类型永远不会被腌制.
解决方案很简单.你想要一个普通的旧unicode字符串,而不是a NavigableString,所以你可以这样做:
awayTeam = unicode(awayQTRScores[0])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1756 次 |
| 最近记录: |