Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Python

वेब पेजेज़ में पायथन के साथ सुंदर सूप स्क्रैपिंग: खोज और डोम संशोधन

by
Difficulty:IntermediateLength:MediumLanguages:
This post is part of a series called Scraping Webpages in Python with Beautiful Soup.
Scraping Webpages in Python With Beautiful Soup: The Basics

Hindi (हिंदी) translation by Satyam Sh. (you can also view the original English article)

पिछले ट्यूटोरियल में, आपने सुंदर सूप लाइब्रेरी की बुनियादी बातें सीखीं। डॉम ट्री को नेविगेट करने के अलावा, आप किसी दिए गए class या id के साथ तत्वों की खोज भी कर सकते हैं। आप इस लाइब्रेरी का उपयोग करके भी डॉम वृक्ष को संशोधित कर सकते हैं।

इस ट्यूटोरियल में, आप विभिन्न तरीकों के बारे में जानेंगे जो खोज और संशोधनों के साथ आपकी मदद करेंगे। हम हमारे पिछले ट्यूटोरियल से पायथन के बारे में विकिपीडिया पेज को स्क्रैप करेंगे।

ट्री खोज के लिए फ़िल्टर

सुंदर सूप में डोम पेड़ की खोज करने के लिए कई तरीके हैं। ये विधियां बहुत समान हैं और समान प्रकार के फिल्टर को तर्क के रूप में लेते हैं। इसलिए, तरीकों के बारे में पढ़ने से पहले यह अलग-अलग फिल्टर को समझने के लिए समझ में आता है। मैं अलग फिल्टर के बीच के अंतर को समझाने के लिए उसी find_all () विधि का उपयोग कर रहा हूं।

सबसे सरल फ़िल्टर जिसे आप किसी भी खोज पद्धति से पारित कर सकते हैं एक स्ट्रिंग है। सुंदर सूप तब एक टैग खोजने के लिए दस्तावेज़ के माध्यम से खोज करेगा जो स्ट्रिंग से मेल खाता है।

आप find_all () विधि में एक नियमित अभिव्यक्ति ऑब्जेक्ट भी पारित कर सकते हैं। इस बार, सुंदर सूप ने दिए गए नियमित अभिव्यक्ति के खिलाफ सभी टैग मिलान करके पेड़ को फ़िल्टर किया होगा।

कोड "एच" से शुरू होने वाले सभी टैगों के लिए दिखेगा और 1 से 6 तक एक अंक के बाद होगा। दूसरे शब्दों में, यह दस्तावेज़ में सभी शीर्षक टैगों की तलाश करेगा।

regex का उपयोग करने के बजाय, आप उन सभी टैगों की एक सूची को पास करके एक ही परिणाम प्राप्त कर सकते हैं, जो आप सुंदर सूप को दस्तावेज़ के खिलाफ मैच के लिए चाहते हैं।

आप find_all () विधि के लिए एक पैरामीटर के रूप में भी True पास कर सकते हैं। कोड तब दस्तावेज़ में सभी टैग वापस करेगा। नीचे दिए गए आउटपुट का मतलब है कि वर्तमान में विकिपीडिया पेज में 4,339 टैग हैं जो हम पार्स कर रहे हैं।

यदि आप अभी भी उपरोक्त फ़िल्टर में से किसी के साथ क्या खोज रहे हैं, तो आप अपने स्वयं के फ़ंक्शन को परिभाषित कर सकते हैं जो एक तत्व को एकमात्र तर्क के रूप में लेता है। फ़ंक्शन को भी True वापस करने की आवश्यकता होती है अगर कोई मैच होता है और अन्यथा False होता है। आप की जरूरत के आधार पर, आप फ़ंक्शन को जटिल बना सकते हैं क्योंकि यह काम करने की आवश्यकता है। यहां एक बहुत सरल उदाहरण है:

उपर्युक्त कार्य एक ही विकिपीडिया पायथन पेज के माध्यम से जा रहा है और अनारडेड सूचियों की तलाश में है जो 20 से अधिक बच्चे हैं।

डोम ट्री का उपयोग करके निर्मित फ़ंक्शंस का उपयोग करना

डीओएम के माध्यम से खोज करने के लिए सबसे लोकप्रिय तरीकों में से एक है Find_all () यह सभी टैग के वंशजों के माध्यम से जाना होगा और सभी खोजकर्ताओं की सूची वापस करेगा जो आपके खोज मानदंड से मेल खाते हैं। इस पद्धति में निम्नलिखित हस्ताक्षर हैं:

name तर्क टैग का नाम है जिसे आप इस फ़ंक्शन को पेड़ से गुज़रते समय खोजना चाहते हैं। आप एक स्ट्रिंग, एक सूची, एक नियमित अभिव्यक्ति, एक फ़ंक्शन, या एक नाम के रूप में True मान प्रदान करने के लिए स्वतंत्र हैं।

आप id, href, आदि जैसे विभिन्न विशेषताओं के आधार पर DOM ट्री में तत्वों को फ़िल्टर भी कर सकते हैं। आप विशिष्ट विशेषता के साथ सभी तत्वों को भी प्राप्त कर सकते हैं, इसके बावजूद attribute=True का उपयोग कर। एक विशिष्ट श्रेणी के तत्वों की खोज करना नियमित विशेषताओं के लिए खोज से अलग है। चूंकि class पायथन  में एक आरक्षित कीवर्ड है, इसलिए आपको विशिष्ट वर्ग के तत्वों की तलाश करते समय class_ कीवर्ड तर्क का उपयोग करना होगा।

आप देख सकते हैं कि दस्तावेज में class विशेषता के साथ 1,734 टैग और id विशेषता वाले 425 टैग हैं। यदि आपको केवल इन परिणामों में से पहले कुछ की आवश्यकता है, तो आप limit के मूल्य के रूप में विधि को एक संख्या प्रदान कर सकते हैं। इस मूल्य को पास करने से सुंदर सूप को एक निश्चित संख्या तक पहुंचने के बाद अधिक तत्वों को ढूंढने से रोकना होगा। यहाँ एक उदाहरण है:

जब आप find_all () विधि का उपयोग करते हैं, तो आप सुंदर सूप को बता रहे हैं कि आप जो ढूंढ रहे हैं उसे खोजने के लिए दिए गए टैग के सभी वंशों के माध्यम से जाने के लिए। कभी-कभी, आप केवल एक टैग पर सीधे चिल्ड्रन में एक तत्व की तलाश करना चाहते हैं। यह recursive=False पास करके प्राप्त किया जा सकता है, find_all () विधि को।

यदि आप किसी विशेष खोज क्वेरी के लिए केवल एक परिणाम में रुचि रखते हैं, तो आप find_all () के लिए limit=1 को पार करने के बजाय इसे खोजने के लिए find() विधि का उपयोग कर सकते हैं। इन दो तरीकों से प्राप्त परिणामों के बीच अंतर केवल यह है कि find_all () एक सूची को केवल एक तत्व के साथ देता है और find() केवल परिणाम देता है।

एक तत्व के लिए find() और find_all () विधियों किसी दिए गए टैग के सभी वंशों में खोज करते हैं। दस अन्य बहुत ही समान तरीके हैं जो आप विभिन्न दिशाओं में डोम वृक्ष के माध्यम से पुनरावृति करने के लिए उपयोग कर सकते हैं।

दिए गए तत्व को खोजने के लिए find_parent() और find_parents() विधियां डोम पेड़ को पार करते हैं। find_next_sibling() और find_next_siblings() पद्धति उन तत्वों के सभी भाइयों के लिए पुनरावृत्त करेगी जो मौजूदा एक के बाद आती हैं। इसी प्रकार, find_previous_sibling() और find_previous_siblings() विधियां वर्तमान तत्व से पहले आने वाले तत्व के सभी भाई-बहनों को पुनरावृत्त करेंगी।

Find_next() और find_all_next() विधियां सभी तत्वों और स्ट्रिंग्स को पुनरावृत्त करती हैं जो वर्तमान तत्व के बाद आती हैं। इसी प्रकार, find_previous() और find_all_previous() तरीकों को सभी तत्वों और स्ट्रिंग्स पर फिर से दोहराना होगा जो वर्तमान तत्व से पहले आते हैं।

आप select() विधि की मदद से सीएसएस चयनकर्ताओं का उपयोग कर तत्वों के लिए भी खोज सकते हैं। कुछ उदाहरण निम्नलिखित हैं:

पेड़ को संशोधित करना

आप केवल एक तत्व ढूंढने के लिए डोम पेड़ के माध्यम से नहीं खोज सकते हैं बल्कि इसे संशोधित भी कर सकते हैं। एक टैग का नाम बदलने और उसके गुणों को संशोधित करना बहुत आसान है।

हमारे पिछले उदाहरण से जारी रखने के लिए, आप .string विशेषता का उपयोग कर दिए गए स्ट्रिंग के साथ टैग की सामग्री को प्रतिस्थापित कर सकते हैं। यदि आप सामग्री को बदलना नहीं चाहते हैं, लेकिन टैग के अंत में कुछ अतिरिक्त जोड़ें, तो आप append() विधि का उपयोग कर सकते हैं।

इसी प्रकार, यदि आप एक विशिष्ट स्थान पर किसी टैग के अंदर कुछ सम्मिलित करना चाहते हैं, तो आप insert() विधि का उपयोग कर सकते हैं। इस पद्धति का पहला पैरामीटर वह स्थिति या सूचकांक है, जिस पर आप सामग्री डालना चाहते हैं, और दूसरा पैरामीटर सामग्री ही है। आप clear() विधि का उपयोग कर किसी टैग के अंदर की सभी सामग्री को निकाल सकते हैं। यह आपको केवल टैग और इसके विशेषताओं के साथ छोड़ देगा।

इस खंड की शुरुआत में, आपने दस्तावेज़ से एक स्तर के दो शीर्षक का चयन किया और इसे एक स्तर तीन शीर्षक पर बदल दिया। उसी चयनकर्ता का उपयोग करके अब आपको अगले स्तर के दो शीर्षक दिखाएंगे जो मूल के बाद आए थे। यह समझ में आता है क्योंकि मूल शीर्षक अब एक स्तर दो शीर्षक नहीं है।

मूल शीर्षक अब h3:nth-of-type(2) का उपयोग करके चयनित किया जा सकता है। यदि आप पूरी तरह से एक तत्व या टैग और पेड़ से अंदर की सभी सामग्री को हटाना चाहते हैं, तो आप decompose() विधि का उपयोग कर सकते हैं।

एक बार जब आप मूल शीर्षक को विघटित या निकाला है, तो तीसरे स्थान पर शीर्षक उसके स्थान पर ले जाता है।

यदि आप किसी टैग और इसकी सामग्री को पेड़ से निकालना चाहते हैं लेकिन टैग को पूरी तरह से नष्ट नहीं करना चाहते हैं, तो आप extract() विधि का उपयोग कर सकते हैं। यह विधि उस टैग को वापस लौटाएगा जिसे इसे निकाला जाएगा। अब आपके पास दो अलग-अलग पेड़ होंगे जिन्हें आप पार्स कर सकते हैं। नए पेड़ की जड़ टैग है जिसे आपने अभी निकाला है।

आप replace_with () विधि का उपयोग करके अपनी पसंद के कुछ और के साथ पेड़ के अंदर एक टैग को प्रतिस्थापित कर सकते हैं। यह विधि उस टैग या स्ट्रिंग को वापस लौटायेगी जो इसे बदल देती है। यह सहायक हो सकता है यदि आप प्रतिस्थापित सामग्री दस्तावेज़ में कहीं और करना चाहते हैं।

उपरोक्त कोड में, दस्तावेज़ का मुख्य शीर्षक b टैग से बदल दिया गया है। दस्तावेज़ में अब एक h1 टैग नहीं है, और इसलिए print(soup.h1) अब None प्रिंट करता है।

अंतिम विचार

इस श्रृंखला में दो ट्यूटोरियल पढ़ने के बाद, आपको अब अलग वेबपेजों को पार्स करने और दस्तावेज़ से महत्वपूर्ण डेटा निकालने में सक्षम होना चाहिए। आपको मूल वेबपेज को पुनः प्राप्त करने में भी सक्षम होना चाहिए, अपनी स्वयं की आवश्यकताओं के अनुरूप इसे संशोधित करना और स्थानीय रूप से संशोधित संस्करण को सहेजना चाहिए।

यदि आपके पास इस ट्यूटोरियल के बारे में कोई प्रश्न हैं, तो कृपया मुझे टिप्पणियों में बताएं।

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.