खोज…


ब्यूटीसाउप में एक तत्व के बाद एक पाठ का पता लगाएँ

कल्पना कीजिए कि आपके पास निम्न HTML हैं:

<div>
    <label>Name:</label>
    John Smith
</div>

और आपको label तत्व के बाद "जॉन स्मिथ" पाठ का पता लगाने की आवश्यकता है।

इस स्थिति में, आप पाठ द्वारा label तत्व का पता लगा सकते हैं और फिर .next_sibling गुण का उपयोग कर .next_sibling हैं :

from bs4 import BeautifulSoup

data = """
<div>
    <label>Name:</label>
    John Smith
</div>
"""

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

label = soup.find("label", text="Name:")
print(label.next_sibling.strip())

John Smith प्रिंट।

SundSoup में तत्वों का पता लगाने के लिए CSS चयनकर्ताओं का उपयोग करना

सुंदरसुपर में सीएसएस चयनकर्ताओं के लिए एक सीमित समर्थन है , लेकिन सबसे अधिक इस्तेमाल किए जाने वाले को कवर करता है। किसी एक तत्व को खोजने के लिए कई तत्वों और select_one() को खोजने के लिए select() विधि का उपयोग select()

मूल उदाहरण:

from bs4 import BeautifulSoup

data = """
<ul>
    <li class="item">item1</li>
    <li class="item">item2</li>
    <li class="item">item3</li>
</ul>
"""

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

for item in soup.select("li.item"):
    print(item.get_text())

प्रिंटों:

item1
item2
item3

टिप्पणियों का पता लगाना

BeautifulSoup में टिप्पणियों का पता लगाने के लिए, text (या हाल के संस्करणों में string ) तर्क का उपयोग करके Comment के प्रकार की जाँच Comment :

from bs4 import BeautifulSoup
from bs4 import Comment

data = """
<html>
    <body>
        <div>
        <!-- desired text -->
        </div>
    </body>
</html>
"""

soup = BeautifulSoup(data, "html.parser")
comment = soup.find(text=lambda text: isinstance(text, Comment))
print(comment)

प्रिंट desired text

फ़िल्टर फ़ंक्शंस

BeautifulSoup आपको find_all और इसी तरह के कार्यों के लिए एक फ़ंक्शन प्रदान करके परिणामों को फ़िल्टर करने की अनुमति देता है। यह जटिल फ़िल्टर के साथ-साथ कोड पुन: उपयोग के लिए एक उपकरण के लिए उपयोगी हो सकता है।

मूल उपयोग

एक फ़ंक्शन को परिभाषित करें जो एक तत्व को अपने एकमात्र तर्क के रूप में लेता है। यदि तर्क मेल खाता है, तो फ़ंक्शन को True लौटना चाहिए।

def has_href(tag):
    '''Returns True for tags with a href attribute'''
    return  bool(tag.get("href"))

soup.find_all(has_href) #find all elements with a href attribute
#equivilent using lambda:
soup.find_all(lambda tag: bool(tag.get("href")))

एक और उदाहरण जो एक href मान के साथ टैग ढूंढता है जो इसके साथ शुरू नहीं होता है

फ़ंक्शंस फ़िल्टर करने के लिए अतिरिक्त तर्क प्रदान करना

चूँकि फ़ंक्शन find_all हो गया है, केवल एक ही तर्क ले सकता है, यह कभी-कभी 'function find_all ' बनाने के लिए उपयोगी होता है, जो find_all में उपयोग के लिए फ़ंक्शंस का उत्पादन करते हैं। यह आपके टैग-फ़ंक्शंस को और अधिक लचीला बनाने के लिए उपयोगी है।

def present_in_href(check_string):
    return lambda tag: tag.get("href") and check_string in tag.get("href")

soup.find_all(present_in_href("/partial/path"))

आरंभिक रूप से चयनित टैग के आंतरिक टैग और उनकी विशेषताओं तक पहुँचना

मान लेते हैं कि आपको soup.find('div', class_='base class') साथ चयन करने के बाद html मिल गया है। soup.find('div', class_='base class') :

from bs4 import BeautifulSoup

soup = BeautifulSoup(SomePage, 'lxml')
html = soup.find('div', class_='base class')
print(html)

<div class="base class">
  <div>Sample text 1</div>
  <div>Sample text 2</div>
  <div>
    <a class="ordinary link" href="https://example.com">URL text</a>
  </div>
</div>

<div class="Confusing class"></div>
'''

और अगर आप <a> टैग के href , तो आप इसे इस तरह से कर सकते हैं:

a_tag = html.a
link = a_tag['href']
print(link)

https://example.com

यह तब उपयोगी होता है जब आप सीधे <a> टैग का चयन नहीं कर सकते क्योंकि यह attrs आपको विशिष्ट पहचान नहीं देता है, पार्स किए गए पृष्ठ में अन्य "जुड़वां" <a> टैग हैं। लेकिन आप विशिष्ट रूप से एक ऐसे पैरेंट टैग का चयन कर सकते हैं, जिसमें आवश्यकता है <a>

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

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

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

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()


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow