2012-04-12 2 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. Итерация свыше THAT 1-length string ...

+0

Не могли бы вы объяснить. Это пример вывода из предыдущего URL-адреса, который он выдает. «И то, что раньше было двухмесячным процессом , для многих компаний в настоящее время является пятидневным процессом. Проблема с повышением 1 до 2 миллионов на конвертируемом ...» это содержит строки, а также строки длиной 1 , – yayu

+0

Какую часть вы не понимаете, итерацию или итерацию? Конечно, все это зависит от того, как вы понимаете, как работает код. –

+0

Можете ли вы пояснить, что значит «вы ударили по строке»? Что значит «удар»? Разве весь HTML-документ, который разбирается Beautiful Soup в DOM изначально, является строкой - и не являются ли сами теги строк символов? Мы столкнулись с той же ошибкой, просто пытающейся подставить значения на простую HTML-страницу с 12 привязками, но неясно, что вызывает рекурсию. – Praxiteles

5

Ваш printText() вызывает себя рекурсивно, если встречается с чем-либо другим, кроме NavigableString. Сюда входят подклассы NavigableString, такие как комментарий. Вызов printText() в комментарии повторяет текст комментария и вызывает бесконечную рекурсию, которую вы видите.

Я рекомендую использовать isinstance() в вашем, если заявление вместо сравнения объектов класса:

if isinstance(tag, basestring): 

Я диагностирована эту проблему вставив оператор печати до рекурсии:

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

+5

sys.setrecursionlimit (1500) – guettli

+0

yup, получил это спасибо ...... Я решил свою проблему, увеличив это. – pranavk

Смежные вопросы