2012-04-12 67 views
5

這是一個beautifulsoup過程,它抓取所有<p> html標籤內的內容。從某些網頁抓取內容後,我收到一個錯誤,指出超出最大遞歸深度。Beautifulsoup,最大遞歸深度達到

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的字符串...

+0

你能解釋一下嗎?這是從前一個url崩潰之後的示例輸出。 「原來是兩個月的過程對於許多公司來說現在是一個爲期五天的過程 在可兌換的情況下提高1到200萬的問題......」這包含字符串以及單長字符串。 – yayu 2012-04-12 06:08:41

+0

哪部分你不明白,迭代或迭代?當然,這一切都取決於你瞭解代碼的工作原理。 – 2012-04-12 06:09:55

+0

你能澄清一下「你打了一根繩子」是什麼意思?你是什​​麼意思「打」?是不是美麗的湯解析成DOM的整個HTML文檔最初是一個字符串 - 而不是標籤本身的字符串?我們遇到了相同的錯誤,只是試圖用12個錨點將值替換成簡單的HTML頁面,但不清楚什麼是觸發遞歸。 – Praxiteles 2016-01-07 10:55:52

5

如果printText()遇到除NavigableString以外的其他任何東西,那麼它會遞歸地調用它自己。這包括NavigableString的子類,如Comment。在評論上調用printText()迭代評論的文本,並導致你看到的無限遞歸。

我建議在你的if語句使用isinstance()代替比較類對象:

if isinstance(tag, basestring): 

我通過遞歸前插入一個print語句診斷這個問題:我有

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

同樣的問題。如果您的嵌套標記深度大約爲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) 
+0

如何增加此限制? – pranavk 2012-10-24 08:48:28

+5

sys.setrecursionlimit(1500) – guettli 2012-10-26 07:30:09

+0

是的,明白了謝謝......我通過增加這個來解決我的問題。 – pranavk 2012-10-26 13:06:59