使用str方法强制转换一个BeautifulSoup对象成字符串的时候报错了,提示是“maximum recursion depth exceeded while calling a Python object”,意思大致是“当调用该对象超过最大递归深度”

报错如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
  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

其实原因是:在Python里的递归调用是有限制的,可以使用sys模块里的getrecursionlimit方法查看,代码如下所示:

1
sys.getrecursionlimit()

打开终端运行Python,可以看到默认限制值为:1000

1
2
3
4
5
6
Python 3.8.3 (tags/v3.8.3:6f8c832, May 13 2020, 22:37:02) [MSC v.1924 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.getrecursionlimit()
1000
>>>

设置最大深度限制的方法就是setrecursionlimit,至于设置值为多少你可以根据情况设置:

1
sys.setrecursionlimit(2000)

深入研究:https://cyrusin.github.io/2015/12/08/python-20151208/