繁体   English   中英

Beautifulsoup,达到最大递归深度

[英]Beautifulsoup, maximum recursion depth reached

这是一个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

如果遇到除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 -长度的字符串...

我有同样的问题。 如果嵌套标签的深度约为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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM