Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Beautifulsoup,已达到最大递归深度_Python_Beautifulsoup - Fatal编程技术网

Python Beautifulsoup,已达到最大递归深度

Python Beautifulsoup,已达到最大递归深度,python,beautifulsoup,Python,Beautifulsoup,这是一个beautifulsoup过程,它捕获所有html标记中的内容。在从一些网页抓取内容之后,我得到一个错误,说超过了最大递归深度 def printText(tags): for tag in tags: if tag.__class__ == NavigableString: print tag, else: printText(tag) print "" #loop over urls, s

这是一个
beautifulsoup
过程,它捕获所有
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

你可能碰到了一根绳子。对字符串进行迭代会产生1个长度的字符串。对该长度为1的字符串进行迭代将生成长度为1的字符串。在该长度为1的字符串上迭代…

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

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

if isinstance(tag, basestring):
我通过在递归之前插入print语句来诊断此问题:

print "recursing on", tag, type(tag)
printText(tag)

我也有同样的问题。如果您有深度约为480级的嵌套标记,并且希望将此标记转换为字符串/unicode,则会得到
达到的运行时错误最大递归深度。每个级别都需要两个嵌套的方法调用,很快就会达到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)
def beautifuly_soup_标签到unicode(标签):
尝试:
返回unicode(标记)
运行时错误除外,如e:
如果不是str(e).startswith('maximum recursion'):
提升
#如果嵌套标记的级别超过480,则可以达到最大递归级别
out=[]
对于tag.findAll中的mystring(text=True):
mystring=mystring.strip()
如果不是mystring:
持续
out.append(mystring)
返回u“%s”%\n。加入(out)

您能解释一下吗。这是以前的url BR崩溃前的输出示例。“对于许多公司来说,过去是两个月的流程现在是五天的流程。在可转换债券上筹集100万到200万美元的问题……”这包含字符串,以及1个长度的字符串。您不了解迭代还是迭代的哪一部分?当然,这一切都取决于你理解代码是如何工作的。你能澄清一下“你碰到了一个字符串”是什么意思吗?“击中”是什么意思?Beauty Soup解析为DOM的整个HTML文档最初不是字符串吗?标记本身不是字符串吗?我们在尝试将值替换为具有12个锚的简单HTML页面时遇到了相同的错误,但不清楚是什么触发了递归。@Praxiteles:DOM文档由节点组成。有些节点是标记,有些是文本。如果尝试对文本(即字符串)进行递归,则将永远递归,因为对非空字符串进行迭代至少会产生1个string.sys.setrecursionlimit(1500)