这是一个beautifulsoup
程序,用于抓取所有<p>
个html标记内的内容。从某些网页抓取内容后,我收到一条错误,指出超出了最大递归深度。
def printText(tags):
for tag in tags:
if tag.__class__ == NavigableString:
print tag,
else:
printText(tag)
print ""
#loop over urls, send soup to printText procedure
追踪的底部:
File "web_content.py", line 16, in printText
printText(tag)
File "web_content.py", line 16, in printText
printText(tag)
File "web_content.py", line 16, in printText
printText(tag)
File "web_content.py", line 16, in printText
printText(tag)
File "web_content.py", line 16, in printText
printText(tag)
File "web_content.py", line 13, in printText
if tag.__class__ == NavigableString:
RuntimeError: maximum recursion depth exceeded in cmp
答案 0 :(得分:5)
如果遇到除NavigableString以外的任何内容,printText()会以递归方式调用自身。这包括NavigableString的子类,例如Comment。在Comment上调用printText()会迭代注释的文本,并导致您看到的无限递归。
我建议在if语句中使用isinstance()而不是比较类对象:
if isinstance(tag, basestring):
我通过在递归之前插入一个print语句来诊断出这个问题:
print "recursing on", tag, type(tag)
printText(tag)
答案 1 :(得分:1)
你可能会打一个字符串。迭代字符串会产生1个长度的字符串。迭代该1长度字符串会产生1个长度的字符串。迭代 THAT 1长度字符串......
答案 2 :(得分:0)
我遇到了同样的问题。如果嵌套标签的深度约为480级,并且您希望将此标记转换为字符串/ unicode,则会得到RuntimeError maximum recursion depth reached
。每个级别都需要两个嵌套的方法调用,很快就会达到默认的1000个嵌套python调用。您可以提高此级别,也可以使用此帮助程序。它从html中提取所有文本并在预环境中显示:
def beautiful_soup_tag_to_unicode(tag):
try:
return unicode(tag)
except RuntimeError as e:
if not str(e).startswith('maximum recursion'):
raise
# If you have more than 480 level of nested tags you can hit the maximum recursion level
out=[]
for mystring in tag.findAll(text=True):
mystring=mystring.strip()
if not mystring:
continue
out.append(mystring)
return u'<pre>%s</pre>' % '\n'.join(out)