2014-03-25 57 views
4

我注意到它可能是由美麗的或遞歸的數據結構引起的。然而,導致錯誤的數據結構,似乎沒有什麼問題:pickle.dump符合RuntimeError:在cmp中超出最大遞歸深度

class Movie: 
def __init__(self, name="", dscore=0, mscore=0, durl="", murl=""): 
    self.name = name 
    self.dscore = float(dscore) 
    self.mscore = float(mscore) 
    self.durl = durl 
    self.murl = murl 
def __str__(self): 
    return unicode(self.name) + u'/' + unicode(self.dscore) + u'/' + unicode(self.mscore) \ 
     + u'/' + unicode(self.durl) + u'/' + unicode(self.murl) 

引起該問題的語句是:

DataDict['MovieInfo'] = MovieInfo 

pickle.dump(DataDict, f, True) 

下面是函數:

def SaveData(): 
global LinkUrlQueue 
global MovieSet 
global MovieInfo 
global LinkUrlSet 
global MovieUrlQueue 
DataDict = {} 
DataDict['LinkUrlSet'] = LinkUrlSet 
DataDict['MovieSet'] = MovieSet 
#DataDict['MovieInfo'] = MovieInfo 
DataDict['LinkUrlQueue'] = LinkUrlQueue 
DataDict['MovieUrlQueue'] = MovieUrlQueue 
f = open('MovieInfo.txt', 'wb') 

for item in MovieInfo: 
    f.write(item.__str__().encode('utf8') + '\n'.encode('utf8')) 
f.close() 
try: 
    print 'saving data...' 
    f = open('spider.dat', 'wb') 
    pickle.dump(DataDict, f, True) 
    f.close() 
except IOError as e: 
    print 'IOError, error no: %d' % e.no 
    print 'saved to spider2.dat' 
    pickle.dump(DataDict, open('spider2.dat', 'wb')) 
    time.sleep(10) 

我的完整版烏爾斯河代碼:

spider.py:http://paste.ubuntu.com/7149731/

fetch.py​​:http://paste.ubuntu.com/7149732/

您只需下載並運行。

此外,歡迎任何編碼風格的建議

+0

將有助於提供重現問題的[SSCCE](http://sscce.org)。 – bereal

+0

我更喜歡PEP8風格。函數都是小寫字母,類都有最初的大寫字母。 – Keith

+0

不要從'__str__'方法返回一個unicode對象。改爲從__unicode__'中返回。 – Keith

回答

7

嗯...我終於通過自己解決問題...

這樣做的原因的問題是,鹹菜不能處理BEAUTIFULSOUP!一般來說,它不能處理html解析器。

我意識到參數傳遞到我的函數時,我應該將它們轉換爲STR()或Unicode()然後做任務,而不是保持它們作爲beautifulsoup對象...

感謝大家〜

相關問題