python - खूबसूरत सूप `खोज 'सभी` जनरेटर




parsing beautifulsoup (2)

क्या एक और स्मृति कुशल जनरेटर में find_all को बदलने का कोई तरीका है? उदाहरण के लिए:

दिया हुआ:

soup = BeautifulSoup(content, "html.parser")
return soup.find_all('item')

मैं इसके बजाय उपयोग करना चाहूंगा:

soup = BeautifulSoup(content, "html.parser")
while True:
    yield soup.next_item_generator()

(अंतिम StopIteration अपवाद के उचित सौंपने का अनुमान StopIteration है)

इसमें कुछ जनरेटर तैयार किए गए हैं, लेकिन अगले परिणाम को खोजने में नहीं मिला। रिटर्न सिर्फ पहली वस्तु find हजारों मदों के साथ, find_all बहुत मेमोरी को बेकार करता है 5792 मदों के लिए, मैं 1 जीबी रैम के ठीक ऊपर देख रहा हूं।

मुझे अच्छी तरह से पता है कि अधिक कुशल पार्सर हैं, जैसे एलएक्सएमएल, जो इसे पूरा कर सकते हैं मान लीजिए कि अन्य व्यावसायिक बाधाएं मुझे कुछ और का उपयोग करने से रोकती हैं

मैं एक अधिक मेमोरी कुशल तरीके से पुनरावृत्त करने के लिए जनरेटर में find_all कैसे बदल सकता हूं।


सरलतम तरीका find_next का उपयोग करना है :

soup = BeautifulSoup(content, "html.parser")

def find_iter(tagname):
    tag = soup.find(tagname)
    while tag is not None:
        yield tag
        tag = tag.find_next(tagname)

दस्तावेज़ :

मैंने जनरेटर PEP 8-संगत नाम दिए, और उन्हें गुणों में बदल दिया:

childGenerator() -> children
nextGenerator() -> next_elements
nextSiblingGenerator() -> next_siblings
previousGenerator() -> previous_elements
previousSiblingGenerator() -> previous_siblings
recursiveChildGenerator() -> descendants
parentGenerator() -> parents

इसमें जनरेटर नामक दस्तावेज़ में अध्याय है, आप इसे पढ़ सकते हैं।

सूपस्ट्रेनेर केवल html के भाग को पार्स करेगा, यह मेमोरी को बचा सकता है, लेकिन यह केवल अप्रासंगिक टैग को अलग करता है, यदि आप चाहते हैं कि टैग के गड़बड़ी एचटीएमएल है, तो यह एक ही मेमोरी समस्या का परिणाम देगा।







beautifulsoup