2012-04-12 23 views
5

पर पहुंच गया यह beautifulsoup प्रक्रिया है जो सभी <p> HTML टैग के भीतर सामग्री को पकड़ती है। कुछ वेब पृष्ठों से सामग्री को हथियाने के बाद, मुझे एक त्रुटि मिलती है जो कहती है कि अधिकतम रिकर्सन गहराई पार हो गई है।सुंदरसुप, अधिकतम रिकर्सन गहराई

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-लंबाई वाली स्ट्रिंग उत्पन्न करती है। से अधिक 1-लंबाई स्ट्रिंग ...

+0

क्या आप समझा सकते हैं। यह पिछले यूआरएल से एक नमूना आउटपुट है इससे पहले कि यह दुर्घटनाग्रस्त हो। "और दो महीने की प्रक्रिया के लिए क्या किया जाता था, अब कई कंपनियों के लिए पांच दिन की प्रक्रिया है। परिवर्तनीय पर आपके 1 से 2 मिलियन को बढ़ाने के साथ समस्या ..." इसमें तार, साथ ही साथ 1-लंबाई तार । – yayu

+0

आप कौन सा हिस्सा समझते हैं, पुनरावृत्त या पुनरावृत्त नहीं करते? बेशक, यह सब आप पर निर्भर करता है कि कोड कैसे काम करता है। –

+0

क्या आप यह स्पष्ट कर सकते हैं कि इसका मतलब क्या है कि "आप एक स्ट्रिंग हिट करते हैं"? आपका क्या मतलब है "हिट"? क्या संपूर्ण HTML दस्तावेज़ नहीं है जिसे सुंदर सूप द्वारा प्रारंभिक रूप से एक स्ट्रिंग में पार्स किया गया है - और क्या टैग स्वयं वर्णों के तार नहीं हैं? हमने एक ही त्रुटि में भाग लिया है जो कि साधारण एंटरप्राइज़ पेज में 12 एंकरों के साथ मूल्यों को प्रतिस्थापित करने की कोशिश कर रहा है लेकिन यह स्पष्ट नहीं है कि रिकर्सन ट्रिगर कर रहा है। – Praxiteles

5

आपका प्रिंटटेक्स्ट() नेविगेलस्ट्रिंग के अलावा किसी अन्य चीज़ से मुकाबला करने पर खुद को रिकर्सिव रूप से कॉल किया जाता है। इसमें NavigableString के उप-वर्ग शामिल हैं, जैसे टिप्पणी। एक टिप्पणी पर printText() को कॉल करने से टिप्पणी के पाठ पर पुनरावृत्ति होती है, और अनंत पुनरावृत्ति का कारण बनता है।

मैं बजाय अपने अगर बयान में isinstance() का उपयोग कर वर्ग वस्तुओं की तुलना की सिफारिश:

if isinstance(tag, basestring): 

मैं प्रत्यावर्तन से पहले एक प्रिंट बयान डालने से इस समस्या का निदान:

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

मैं था एक ही समस्या है। यदि आपके पास लगभग 480 स्तरों की गहराई वाले टैग हैं, और आप इस टैग को स्ट्रिंग/यूनिकोड में कनवर्ट करना चाहते हैं, तो आपको मिल जाएगा। प्रत्येक स्तर को दो नेस्टेड विधि कॉल की आवश्यकता होती है और जल्द ही आप 1000 नेस्टेड पायथन कॉल का डिफ़ॉल्ट हिट करते हैं। आप इस स्तर को बढ़ा सकते हैं, या आप इस सहायक का उपयोग कर सकते हैं। यह एचटीएमएल से सभी पाठ निकालता है और इसे पूर्व-पर्यावरण में प्रदर्शित करता है:

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

संबंधित मुद्दे