2016-06-17 10 views
6

उदाहरण HTMLBeautifulSoup CSS चयनकर्ता के साथ पाठ जाओ

<h2 id="name"> 
    ABC 
    <span class="numbers">123</span> 
    <span class="lower">abc</span> 
</h2> 

मैं की तरह कुछ के साथ नंबर प्राप्त कर सकते हैं:

soup.select('#name > span.numbers')[0].text 

मैं पाठ ABC BeautifulSoup और select फ़ंक्शन का उपयोग कैसे मिलता है?

इस मामले में क्या?

<div id="name"> 
    <div id="numbers">123</div> 
    ABC 
</div> 

उत्तर

6

पहले मामले में, previous sibling मिलती है: मुझे लगता है कि यह है कि यह है कि यहाँ जानबूझकर है आप

soup.select_one('#name > #numbers').next_sibling 

नोट:

soup.select_one('#name > span.numbers').previous_sibling 

दूसरे मामले में, मिल next siblingnumbers को id मान के रूप में रखें और span के बजाय टैग div है। इसलिए, मैंने सीएसएस चयनकर्ता को समायोजित किया है।


दोनों ही मामलों को कवर करने के लिए, आपको टैग के माता-पिता के पास जाकर एक गैर पुनरावर्ती मोड में गैर खाली पाठ नोड पा सकते हैं:

parent = soup.select_one('#name > .numbers,#numbers').parent 
print(parent.find(text=lambda text: text and text.strip(), recursive=False).strip()) 

नोट चयनकर्ता में परिवर्तन - हम numbers आईडी या numbers कक्षा से मेल खाने के लिए कह रहे हैं।

हालांकि, मुझे एहसास है कि यह सार्वभौमिक समाधान काफी विश्वसनीय नहीं होगा क्योंकि शुरुआत करने वालों के लिए, मुझे नहीं पता कि आपके असली इनपुट क्या हो सकते हैं।

+0

हां, आईडी और div बनाम अवधि में परिवर्तन जानबूझकर था। ध्यान देने के लिए धन्यवाद! क्या आपके पिछले समाधान में माता-पिता से शुरू करने का कोई तरीका है और फिर # 1 के मामले में पहले बच्चे के लिए या दूसरे बच्चे के लिए # 2 के मामले में सीधे चयन करें? मैं खोजने या खोजने का उपयोग करने से बचने की कोशिश कर रहा हूं। – slaw

+0

@ एसएलए हाँ, निश्चित रूप से, आप केवल 'सामग्री' सूची का उपयोग कर सकते हैं: 'tag.contents [0] 'या' tag.contents [1] '। या, 'tag.children' जनरेटर के माध्यम से जाओ। – alecxe

संबंधित मुद्दे