বিউটিফুলসপ ব্যবহার করে কীভাবে নোডের বাচ্চাদের সন্ধান করবেন


115

আমি সমস্ত <a>ট্যাগগুলি পেতে চাই যা এর সন্তানের <li>:

<div>
<li class="test">
    <a>link1</a>
    <ul> 
       <li>  
          <a>link2</a> 
       </li>
    </ul>
</li>
</div>

আমি জানি যে কীভাবে নির্দিষ্ট শ্রেণীর সাথে এই উপাদানটি পাওয়া যায়:

soup.find("li", { "class" : "test" }) 

তবে আমি জানি না যে কীভাবে সমস্ত কিছুই অন্যের নয় <a>, তার সন্তানের are<li class=test>

যেমনটি আমি নির্বাচন করতে চাই:

<a>link1</a>

উত্তর:


124

এটা চেষ্টা কর

li = soup.find('li', {'class': 'text'})
children = li.findChildren("a" , recursive=False)
for child in children:
    print child

3
অথবা, শুধু অভিব্যক্তি বর্ণনা করে আমরা কি চাই বের করে আনতে: soup.find('li', {'class': 'text'}).findChildren()
কার্ল নচেটেল

3
তবে কীভাবে ফ্রিজ পাবেন <a> ট্যাগ কেবল ওয়ার্ডগুলির পরে নয়। find(li).find(a).firstChild()
তেমন

"রিকার্সিভ" kwarg :) জন্য ধন্যবাদ
সুইফট

121

ডিওসিতে একটি দুর্দান্ত ছোট বিভাগ রয়েছে যা দেখায় যে প্রত্যক্ষ প্রত্যক্ষ বাচ্চাদের কীভাবে সন্ধান / সন্ধান করতে হবে ।

https://www.crummy.com/software/BeautifulSoup/bs4/doc/#the-recursive-argument

আপনার ক্ষেত্রে যেমন আপনি লিঙ্ক 1 চান যা প্রথম প্রত্যক্ষ শিশু:

# for only first direct child
soup.find("li", { "class" : "test" }).find("a", recursive=False)

আপনি যদি সমস্ত প্রত্যক্ষ বাচ্চাদের চান:

# for all direct children
soup.find("li", { "class" : "test" }).findAll("a", recursive=False)

12

সম্ভবত আপনি করতে চান

soup.find("li", { "class" : "test" }).find('a')

1
আমি মনে করি এটিও সন্ধান করবে <a> link2 </a>তবে আমি এটি চাই না
tej.tan

1
এটি প্রশ্নের উত্তর <a>link1</a>দেওয়া এইচটিএমএলটিতে কীভাবে নির্বাচন করবেন সেই প্রশ্নের উত্তর দেয় , তবে এটি প্রথম <li class="test">হবে যখন প্রথমটিতে কোনও <a>উপাদান থাকবে না এবং শ্রেণি liসহ অন্যান্য উপাদান testরয়েছে <a>
র‌্যাডজাক

11

এটা চেষ্টা কর:

li = soup.find("li", { "class" : "test" })
children = li.find_all("a") # returns a list of all <a> children of li

অন্যান্য অনুস্মারক:

সন্ধানের পদ্ধতিটি কেবল প্রথম সংঘটিত শিশু উপাদানটি পায়। Find_all পদ্ধতিটি সমস্ত বংশধর উপাদান পায় এবং একটি তালিকায় সংরক্ষণ করা হয়।


2
প্রশ্নকর্তা উপরোক্ত দুটি বিকল্পের একটিও চাইছেন না। তিনি এমন সমস্ত লিঙ্ক চান যা কেবল প্রত্যক্ষ শিশু।
আহসান রায়

8

"কিভাবে সব এটি aযার সন্তান <li class=test>কিন্তু কোনো অন্যদের?"

নীচের এইচটিএমএল দেওয়া হয়েছে ( এবং এর <a>মধ্যে পার্থক্য দেখানোর জন্য আমি আরও একটি যুক্ত করেছি ):selectselect_one

<div>
  <li class="test">
    <a>link1</a>
    <ul>
      <li>
        <a>link2</a>
      </li>
    </ul>
    <a>link3</a>
  </li>
</div>

সমাধানটি হ'ল চাইল্ড কম্বিনেটর ( >) ব্যবহার করুন যা দুটি সিএসএস নির্বাচকদের মধ্যে স্থাপন করা হয়েছে:

>>> soup.select('li.test > a')
[<a>link1</a>, <a>link3</a>]

আপনি যদি কেবল প্রথম সন্তানের সন্ধান করতে চান তবে:

>>> soup.select_one('li.test > a')
<a>link1</a>

এটিই আমি খুঁজছিলাম। আমি এটি ভুল পদ্ধতিতে সরবরাহ করছিলাম। ভুলে গেছেন> একজন সিএসএস নির্বাচক। ধন্যবাদ!
LFMekz

7

তবুও অন্য একটি পদ্ধতি - একটি ফিল্টার ফাংশন তৈরি করুন যা Trueসমস্ত পছন্দসই ট্যাগগুলির জন্য ফিরে আসে :

def my_filter(tag):
    return (tag.name == 'a' and
        tag.parent.name == 'li' and
        'test' in tag.parent['class'])

তারপরে কেবল find_allযুক্তি দিয়ে কল করুন:

for a in soup(my_filter): # or soup.find_all(my_filter)
    print a
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.