2012-04-12 14 views
5

Bu, <p> html etiketlerindeki içeriğin tamamını kaplayan beautifulsoup yöntemidir. Bazı web sayfalarından içerik aldıktan sonra, maksimum yineleme derinliği aşıldı diyen bir hata alıyorum. Beautifulsoup, maksimum yineleme derinliğine ulaşıldı

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 

izinin alt

:

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 

cevap

1

Muhtemelen bir dize çarptı. Bir dize üzerinde yineleme, 1 uzunluklu dizeleri verir. Bu 1 uzunlukta dizgenin üzerinde yineleme, 1 uzunluklu bir dize verir. üzerinde Iterating 0 THR 1 uzunluklu dize ...

+0

Açıklar. Bu, önceki bir URL'den kaynaklanan bir örnek çıktıdır. " iki aylık bir süreç için kullanılan, şu anda beş günlük bir süreçtir. Dönüştürülebilir 1 ila 2 milyonluk sorun ..." Bu dizeleri içerir, ayrıca 1 uzunlukta dizeleri içerir . – yayu

+0

Hangi bölümü anlamıyorsunuz, yineleyici mi yoksa yinelenen mi? Elbette, bu, kodun nasıl çalıştığını anlamanıza bağlıdır. –

+0

"Dize vurduğun" ne anlama geldiğini açıklayabilir misin? Ne demek "vurmak"? Güzel Çorba tarafından başlangıçta bir dizeye dönüştürülen tüm HTML belgesi değil - ve bu etiketler kendilerini karakter dizeleri değil mi? Aynı hatayı, sadece 12 anchor içeren basit bir HTML sayfasına değerlerin yerini almaya çalıştık, ancak tetiklemenin ne olduğu açık değil. – Praxiteles

5

PrintText() öğeniz, bir Gezinti Uygulamasından başka bir şeyle karşılaştığında kendini yinelemeli olarak çağırır. Bu, Comment gibi NavigableString alt sınıflarını içerir. Yorumdaki printText() 'i çağırmak, yorumun metnini yineler ve gördüğünüz sonsuz yinelemeye neden olur.

Ben senin eğer açıklamada isinstance() kullanarak yerine sınıf nesneleri karşılaştırarak tavsiye: Ben

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

: Ben özyineleme önce bir yazdırma deyimi ekleyerek bu sorunu teşhis

if isinstance(tag, basestring): 

aynı sorun. Yaklaşık 480 düzey derinliğe sahip iç içe geçmiş etiketleriniz varsa ve bu etiketi dize/unicode'a dönüştürmek istiyorsanız, 'u edinebilirsiniz. Her seviyede iki iç içe geçmiş yöntem çağrısı gerekir ve yakında 1000 yuvalanmış python çağrısının varsayılanını vurursunuz. Bu seviyeyi yükseltebilir veya bu yardımcıyı kullanabilirsiniz. Tüm metni html'den ayıklar ve bir ortam içinde görüntüler:

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

Bu sınır nasıl artırılır? – pranavk

+5

sys.setrecursionlimit (1500) – guettli

+0

yup, teşekkürler aldım ...... bunu arttırarak problemimi çözdüm. – pranavk