सुंदर सूप और आईडी द्वारा एक div और इसकी सामग्री निकालने


147
soup.find("tagName", { "id" : "articlebody" })

यह <div id="articlebody"> ... </div>टैग और सामान को बीच में क्यों नहीं लौटाता है ? यह कुछ भी नहीं लौटाता है। और मुझे पता है कि यह एक तथ्य के लिए मौजूद है क्योंकि मैं इसे सही से देख रहा हूं

soup.prettify()

soup.find("div", { "id" : "articlebody" }) भी काम नहीं करता है।

( संपादित करें: मैंने पाया कि ब्यूटीफुल मेरे पेज को सही ढंग से पार्स नहीं कर रहा था, जिसका मतलब था कि जिस पेज को मैं पार्स करने की कोशिश कर रहा था, वह एसजीएमएल या जो भी हो, ठीक से प्रारूपित नहीं है)


(आपके EDIT के लिए, इस सवाल का अभी भी दूसरों के लिए एक पुन: प्रयोज्य संसाधन के रूप में मूल्य है, भले ही पार्सर आपके विशेष पेज पर काम न करे)
smci

जवाबों:


202

आपको अपना उदाहरण दस्तावेज़ पोस्ट करना चाहिए, क्योंकि कोड ठीक काम करता है:

>>> import BeautifulSoup
>>> soup = BeautifulSoup.BeautifulSoup('<html><body><div id="articlebody"> ... </div></body></html')
>>> soup.find("div", {"id": "articlebody"})
<div id="articlebody"> ... </div>

ढूँढना <div>रों अंदर <div>और साथ ही रों काम करता है:

>>> soup = BeautifulSoup.BeautifulSoup('<html><body><div><div id="articlebody"> ... </div></div></body></html')
>>> soup.find("div", {"id": "articlebody"})
<div id="articlebody"> ... </div>

2
मेरा उदाहरण दस्तावेज़ बहुत बड़ा है। मैं समस्या पर नज़र रख रहा हूँ - मुझे लगता है कि यह divs के विभाग पर काम नहीं करता है। मैंने दस्तावेज़ में प्रिंट लीन (सूप ('div')) के साथ कितने div हैं, जो कि 10 का परिणाम था, और मैं फायरबग के साथ 10 से अधिक div देख सकता हूं। इसलिए मुझे लगता है कि यह सिर्फ डिव के अंदर डिव नहीं पा सकता है, इसलिए मुझे रैपर से नीचे की चीजों को संकरा करने की जरूरत है।
टोनी स्टार्क

8
खैर, फिर आपके सवाल का जवाब देना असंभव है, क्रिस्टल बॉल डिबगिंग का एक विश्वसनीय तरीका नहीं है। :)
लुकास लालकिंसि

1
मैंने इस कोड की कोशिश की। div में <एम्बेड> है और मैं इसके अंदर एम्बेड प्रिंट नहीं कर सकता।
विंसेंट

13
या अधिक बसdiv = soup.find(id="articlebody")
JFS

4
याsoup.find('div', id='articlebody')
ट्रेवर बॉयड स्मिथ

71

इसके द्वारा एक तत्व खोजने के लिए id:

div = soup.find(id="articlebody")

15

सुंदर सूप 4 विधि के साथ सबसे सीएसएस चयनकर्ताओं का समर्थन करता है , इसलिए आप एक चयनकर्ता का उपयोग कर सकते हैं जैसे:.select()id

soup.select('#articlebody')

यदि आपको तत्व के प्रकार को निर्दिष्ट करने की आवश्यकता है, तो आप चयनकर्ता से पहले एक प्रकार का चयनकर्ता जोड़ सकते हैं id:

soup.select('div#articlebody')

.select()विधि जिसका अर्थ है कि यह निम्नलिखित के रूप में एक ही परिणाम वापसी होगी तत्वों का एक संग्रह, वापस आ जाएगी .find_all()विधि उदाहरण:

soup.find_all('div', id="articlebody")
# or
soup.find_all(id="articlebody")

यदि आप केवल एक ही तत्व का चयन करना चाहते हैं, तो आप केवल .find()विधि का उपयोग कर सकते हैं :

soup.find('div', id="articlebody")
# or
soup.find(id="articlebody")

13

मुझे लगता है कि एक समस्या है जब 'div' टैग बहुत ज्यादा नेस्टेड हैं। मैं एक facebook html फ़ाइल से कुछ संपर्कों को पार्स करने की कोशिश कर रहा हूं, और ब्यूटीफुलस वर्ग "fcontent" के साथ टैग "div" को खोजने में सक्षम नहीं है।

यह अन्य वर्गों के साथ भी होता है। जब मैं सामान्य रूप से divs की खोज करता हूं, तो यह केवल उन लोगों को बदल देता है जो इतने घोंसले नहीं हैं।

Html स्रोत कोड आप के मित्र की सूची (आपके मित्रों में से एक नहीं) की फेसबुक से कोई भी पृष्ठ हो सकता है। अगर कोई इसका परीक्षण कर सकता है और कुछ सलाह दे सकता है तो मैं वास्तव में इसकी सराहना करूंगा।

यह मेरा कोड है, जहां मैं कक्षा "फोंटेंट" के साथ टैग "div" की संख्या को प्रिंट करने का प्रयास करता हूं:

from BeautifulSoup import BeautifulSoup 
f = open('/Users/myUserName/Desktop/contacts.html')
soup = BeautifulSoup(f) 
list = soup.findAll('div', attrs={'class':'fcontent'})
print len(list)

9

सबसे शायद इसलिए क्योंकि डिफॉल्ट सुंदरसॉपर पार्सर में समस्या है। एक अलग पार्सर बदलें, जैसे 'lxml' और फिर से प्रयास करें।


यह मेरे लिए काम किया, धन्यवाद! मैं प्रयोग किया जाता हैsoup = BeautifulSoup(data, parser="html.parser")
इच्छा हार्ट

8

सुंदरसुपर स्रोत में यह रेखा divs को divs के भीतर नेस्टेड होने देती है; इसलिए लुकास की टिप्पणी में आपकी चिंता मान्य नहीं होगी।

NESTABLE_BLOCK_TAGS = ['blockquote', 'div', 'fieldset', 'ins', 'del']

मुझे लगता है कि आपको इस तरह के रूप में वांछित अटैचमेंट को निर्दिष्ट करना होगा

source.find('div', attrs={'id':'articlebody'})

5

क्या आपने कोशिश की है soup.findAll("div", {"id": "articlebody"})?

पागल लग रहा है, लेकिन अगर आप जंगली से सामान स्क्रैप कर रहे हैं, तो आप कई divs से इंकार नहीं कर सकते ...


4

मैंनें इस्तेमाल किया:

soup.findAll('tag', attrs={'attrname':"attrvalue"})

खोजने / खोजने के लिए मेरे वाक्यविन्यास के रूप में; जब तक कि टैग और विशेषता सूची के बीच अन्य वैकल्पिक पैरामीटर नहीं हैं, तब तक यह अलग नहीं होना चाहिए।


4

Google को कुरेदने की कोशिश करते हुए मेरे साथ भी हुआ।
मैंने अजवाइन का उपयोग करके समाप्त कर दिया।
इंस्टॉल:

pip install pyquery

उपयोग:

from pyquery import PyQuery    
pq = PyQuery('<html><body><div id="articlebody"> ... </div></body></html')
tag = pq('div#articlebody')

3

यहाँ एक कोड टुकड़ा है

soup = BeautifulSoup(:"index.html")
titleList = soup.findAll('title')
divList = soup.findAll('div', attrs={ "class" : "article story"})

जैसा कि आप देख सकते हैं कि मुझे सभी टैग मिल गए हैं और फिर मुझे कक्षा = "लेख" के साथ सभी टैग मिल गए हैं


0

Idसंपत्ति हमेशा विशिष्ट पहचान है। इसका मतलब है कि आप इसे सीधे तत्व को निर्दिष्ट किए बिना भी उपयोग कर सकते हैं। इसलिए, यह एक प्लस पॉइंट है यदि आपके तत्वों के पास सामग्री के माध्यम से पार्स करना है।

divEle = soup.find(id = "articlebody")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.