6

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

3 回答 3

5

如果您的 printText() 遇到除 NavigableString 以外的任何内容,它会递归调用自身。这包括 NavigableString 的子类,例如 Comment。在 Comment 上调用 printText() 会迭代评论的文本,并导致您看到的无限递归。

我建议在 if 语句中使用 isinstance() 而不是比较类对象:

if isinstance(tag, basestring):

我通过在递归之前插入打印语句来诊断这个问题:

print "recursing on", tag, type(tag)
printText(tag)
于 2012-04-12T13:58:21.330 回答
1

你可能打了一个字符串。迭代一个字符串会产生长度为 1 的字符串。迭代那个长度为 1 的字符串会产生一个长度为 1 的字符串。迭代那个1-length 字符串...

于 2012-04-12T06:06:00.527 回答
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)
于 2012-08-28T09:31:26.963 回答