2012-04-12 15 views
5

To jest procedura beautifulsoup, która pobiera treści we wszystkich znacznikach html <p>. Po pobraniu treści z niektórych stron internetowych pojawia się błąd z informacją, że maksymalna głębokość rekurencji została przekroczona.Beautifulsoup, maksymalna głębokość rekursji osiągnęła

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 

Dno śladu:

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 

Odpowiedz

1

Prawdopodobnie uderzył ciąg. Iteracja przez łańcuch daje ciągi o długości 1. Iteracja nad tym ciągiem o długości 1 daje łańcuch o długości 1. Iteracja nad ŻE 1 długości ciąg ...

+0

mógłbyś wyjaśnić. Jest to przykładowe wyjście z poprzedniego adresu URL, ponieważ ulega awarii. "To, co kiedyś było dwumiesięcznym procesem, dla wielu firm jest obecnie dla wielu firm pięciodniowym procesem: Problem z podniesieniem 1 do 2 milionów w przypadku zamiennego ..." to zawiera łańcuchy, a także ciągi o 1 długości . – yayu

+0

W której części nie rozumiesz, iteracji lub iteracji? Oczywiście wszystko to zależy od zrozumienia, w jaki sposób działa kod. –

+0

Czy możesz wyjaśnić, co oznacza "uderzasz w strunę"? Co masz na myśli mówiąc "hit"? Czy cały dokument HTML nie jest parsowany przez Beautiful Soup do DOM-a początkowo jako ciąg - i czy same znaczniki nie są ciągami znaków? Wystąpił ten sam błąd, po prostu próbując zastąpić wartości na prostej stronie HTML z 12 zakotwiczeniami, ale nie jest jasne, co wywołuje rekursję. – Praxiteles

5

Twój printText() wywołuje się rekurencyjnie jeśli napotka coś innego niż NavigableString. Obejmuje to podklasy NavigableString, takie jak Comment. Wywołanie funkcji printText() w komentarzu powoduje iterację tekstu komentarza i powoduje wyświetlenie nieskończonej rekurencji.

polecam korzystania isinstance() w if zamiast porównywania obiektów Klasa:

if isinstance(tag, basestring): 

ja zdiagnozowano ten problem poprzez wprowadzenie instrukcji print przed rekursji:

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

miałem taki sam problem. Jeśli masz zagnieżdżone znaczniki o głębokości około 480 poziomów i chcesz przekonwertować ten znacznik na ciąg/kod Unicode, otrzymasz numer . Każdy poziom wymaga dwóch zagnieżdżonych wywołań metod i wkrótce trafisz domyślnie 1000 zagnieżdżonych połączeń python. Możesz podnieść ten poziom lub możesz użyć tego pomocnika. Wydobywa cały tekst z html i wyświetla je w ampułko-środowiska:

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

jak zwiększyć ten limit? – pranavk

+5

sys.setrecursionlimit (1500) – guettli

+0

tak, mam to dzięki ...... rozwiązałem mój problem, zwiększając to. – pranavk

Powiązane problemy