beautifulsoup पृष्ठों की श्रृंखला से वैकल्पिक तत्वों और / या उनकी विशेषताओं को एकत्रित करना


उदाहरण

आइए स्थिति पर विचार करें जब आप पृष्ठों की संख्या को पार्स करते हैं और आप उस तत्व से मूल्य एकत्र करना चाहते हैं जो एक पृष्ठ के लिए वैकल्पिक हो (एक पृष्ठ पर प्रस्तुत किया जा सकता है और दूसरे पर अनुपस्थित हो सकता है)।

इसके अलावा तत्व स्वयं, उदाहरण के लिए, पृष्ठ पर सबसे साधारण तत्व है, दूसरे शब्दों में कोई विशिष्ट गुण इसे विशिष्ट रूप से नहीं ढूँढ सकता है। लेकिन आप देखते हैं कि आप इसके मूल तत्व का ठीक से चयन कर सकते हैं और आप जानते हैं कि संबंधित घोंसले के स्तर में तत्व का क्रम संख्या क्या है।

from bs4 import BeautifulSoup

soup = BeautifulSoup(SomePage, 'lxml')
html = soup.find('div', class_='base class') # Below it refers to html_1 and html_2

वांटेड तत्व वैकल्पिक है, इसलिए html लिए 2 परिस्थितियां हो सकती हैं:

html_1 = '''
<div class="base class">    # №0
  <div>Sample text 1</div>  # №1
  <div>Sample text 2</div>  # №2  
  <div>!Needed text!</div>  # №3
</div>

<div>Confusing div text</div>  # №4
'''
        
html_2 = '''
<div class="base class">    # №0
  <div>Sample text 1</div>  # №1
  <div>Sample text 2</div>  # №2  
</div>

<div>Confusing div text</div>  # №4
'''

अगर आपको html_1 मिला है तो आप !Needed text! जमा कर सकते हैं !Needed text! इस तरह से टैग №3 से:

wanted tag = html_1.div.find_next_sibling().find_next_sibling() # this gives you whole tag №3

यह शुरू में ,1 div हो जाता है, फिर gets3 पर जाने के लिए 2 बार उसी nesting स्तर पर अगले div पर स्विच करता है।

wanted_text = wanted_tag.text # extracting !Needed text!

इस दृष्टिकोण की उपयोगिता तब आती है जब आप html_2 प्राप्त html_2 - दृष्टिकोण आपको त्रुटि नहीं देगा, यह None :

print(html_2.div.find_next_sibling().find_next_sibling())
None

यहां find_next_sibling() का उपयोग करना महत्वपूर्ण है क्योंकि यह संबंधित खोज स्तर से तत्व खोज को सीमित करता है। यदि आप find_next() उपयोग करते हैं तो टैग find_next() एकत्र किया जाएगा और आप इसे नहीं चाहते हैं:

print(html_2.div.find_next().find_next())
<div>Confusing div text</div>

आप find_previous_sibling() और find_previous() का भी पता find_previous_sibling() सकते हैं, जो सीधे विपरीत तरीके से काम करते हैं।

सभी वर्णित कार्यों में सभी टैगों को पकड़ने के लिए उनके पहले के वेरिएंट हैं, न कि केवल पहले एक:

find_next_siblings()
find_previous_siblings()
find_all_next()
find_all_previous()