6

これは、すべてのhtml タグbeautifulsoup内のコンテンツを取得する手順です。<p>一部の Web ページからコンテンツを取得した後、最大再帰深度を超えたことを示すエラーが表示されます。

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

NavigableString 以外のものに遭遇した場合、printText() はそれ自体を再帰的に呼び出します。これには、Comment などの NavigableString のサブクラスが含まれます。Comment で printText() を呼び出すと、コメントのテキストが繰り返され、表示される無限再帰が発生します。

クラス オブジェクトを比較する代わりに、if ステートメントで isinstance() を使用することをお勧めします。

if isinstance(tag, basestring):

再帰の前に print ステートメントを挿入して、この問題を診断しました。

print "recursing on", tag, type(tag)
printText(tag)
于 2012-04-12T13:58:21.330 に答える
0

私も同じ問題を抱えていました。約 480 レベルの深さのネストされたタグがあり、このタグを文字列/Unicode に変換する場合は、RuntimeError maximum recursion depth reached. すべてのレベルで 2 つのネストされたメソッド呼び出しが必要であり、すぐにデフォルトの 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 に答える