beautifulsoup
तत्वों का पता लगाना
खोज…
ब्यूटीसाउप में एक तत्व के बाद एक पाठ का पता लगाएँ
कल्पना कीजिए कि आपके पास निम्न 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()