標籤:python maximum recursion getrecursionlimit setrecursionlimit
今天在寫爬蟲的時候,發現了一個詭異的事情,使用str方法強制轉換一個BeautifulSoup對象成字串的時候報錯了,提示是“maximum recursion depth exceeded while calling a Python object”,意思大致是“當調用該對象超過最大遞迴深度”
報錯如下:
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Python27\lib\site-packages\bs4\element.py", line 1045, in __str__ return self.encode() File "C:\Python27\lib\site-packages\bs4\element.py", line 1055, in encode u = self.decode(indent_level, encoding, formatter) File "C:\Python27\lib\site-packages\bs4\element.py", line 1126, in decode indent_contents, eventual_encoding, formatter) File "C:\Python27\lib\site-packages\bs4\element.py", line 1195, in decode_contents formatter)) File "C:\Python27\lib\site-packages\bs4\element.py", line 1126, in decode ...... File "C:\Python27\lib\site-packages\bs4\element.py", line 1126, in decode indent_contents, eventual_encoding, formatter) File "C:\Python27\lib\site-packages\bs4\element.py", line 1195, in decode_contents formatter)) File "C:\Python27\lib\site-packages\bs4\element.py", line 1098, in decode text = self.format_string(val, formatter) File "C:\Python27\lib\site-packages\bs4\element.py", line 163, in format_string output = formatter(s) File "C:\Python27\lib\site-packages\bs4\element.py", line 120, in substitute_xml ns, EntitySubstitution.substitute_xml) File "C:\Python27\lib\site-packages\bs4\element.py", line 104, in _substitute_if_appropriate if (isinstance(ns, NavigableString)RuntimeError: maximum recursion depth exceeded while calling a Python object
而後更神奇的是我使用的ptpython並沒有報錯,直接通過了。
其實原因是在Python裡的遞迴調用是有限制的,可以使用sys模組裡的getrecursionlimit方法查看的到,即(想深入的同學可以Google上搜尋一番,這裡提供筆者所搜尋到的https://cyrusin.github.io/2015/12/08/python-20151208/)
sys.getrecursionlimit()
開啟終端運行Python,可以看到預設限制值為1000
650) this.width=650;" src="http://s1.51cto.com/wyfs02/M01/8B/C3/wKiom1hXscDBcpqVAAAKssVwL6Y070.png-wh_500x0-wm_3-wmp_4-s_698534623.png" title="QQ20161219180614.png" alt="wKiom1hXscDBcpqVAAAKssVwL6Y070.png-wh_50" />
而ptpython裡預設限制值為2000,這也不難解釋為什麼python下直接運行會報最大深度遞迴錯誤而ptpython可以正常運行了。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/8B/C3/wKiom1hXtBqjFGRnAAADxmCmvtk125.png-wh_500x0-wm_3-wmp_4-s_803356705.png" title="QQ20161219181829.png" alt="wKiom1hXtBqjFGRnAAADxmCmvtk125.png-wh_50" />
那麼該來解決這個問題了,有get自然有set(當然還有其他方法比如達到深度限制時就做對應處理這方面不符合筆者目前需求,所以就不贅述,有需求的同學請自行Google百度一下),那麼設定最大深度限制的方法就是setrecursionlimit了,至於設定值為多少你自行設定了
sys.setrecursionlimit(2000)
至此,問題解決!
本文出自 “雲驛站 -Leyex學習筆記” 部落格,請務必保留此出處http://leyex.blog.51cto.com/4230949/1884041
Python的最大遞迴深度錯誤 “maximum recursion depth exceeded while calling a Python object”