در کتابخانه bs4 دو متد به نام ()select_one و ()select وجود دارند که همانند متدهای ()find و ()find_all هستند با این تفاوت که این دو متد تنها یک ورودی رشته را دریافت می کنند که به عنوان CSS Selector خواهد بود. در این مطلب می خواهیم بوسیله متد ()select فهرست ویدیوهای صفحه خانگی سایت آپارت را دریافت کنیم. فرض کنید می خواهیم متن تمامی تگ های p با کلاس یا id یا شناسه highlight را بدست آوریم، پس باید کد زیر را استفاده کنیم.

همانطور که در کدهای بالا می بینید برای دسترسی به تمامی تگ های p با کلاس highlight از نقطه میان نام تگ و نام کلاس و به صورت p.highlight استفاده شده است و برای دسترسی به تمامی تگ های p با شناسه highlight از کاراکتر (نویسه) # میان نام تگ و نام کلاس و به صورت p#highlight استفاده شده است. در متد ()find و زمانی که بخواهیم نخستین تگ با شناسه highlight را پیدا کنیم، از کد زیر استفاده می شود. در واقع در کد زیر مهم نیست تگ چیست، بلکه تنها شناسه آن مهم است.

فرض کنید می خواهید تمامی تگ های p درون تگ div را بدست آورید که کلاس تگ div برابر با highlight است، پس چون تگ های p درون div است، p به عنوان فرزند تگ div خواهد بود و از این رو باید از رشته div.highlight p درون متد ()select و به صورت زیر استفاده کنید. حال فرض کنید کلاس div به صورت CAPS highlight باشد، به این معنی که از دو واژه تشکیل شده باشد. دستور دوم تمامی تگ های p درون div با کلاس CAPS highlight را پیدا می کند و همانطور که می بینید میان واژه های کلاس، نقطه گذاشته شده است. بنابراین نخست نام تگ پدر (والد) و سپس نام کلاس فرزند با یک فاصله از هم نوشته می شوند.

نمونه هایی از برگزیدن تگ ها بوسیله متد ()select

۱ – برگزیدن تگ titile

۲ – برگزیدن تمامی تگ های a درون تگ body بدون توجه به نام کلاس یا شناسه آنها

۳ – برگزیدن تگ title به صورت ساختار درختواره ای

۴ – برگزیدن تگ title که فرزند تگ head است.

۵ – برگزیدن تمامی تگ های a که درون تگ های p قرار دارند. درحالت ۴ و ۵ می بینید که در سمت چپ کاراکتر (نویسه) < تگ پدر (والد) و در سمت راست آن تگ فرزند وجود دارد.

۶ – برگزیدن تمامی تگ های با کلاس highlight

۵ برگزیدن تمامی تگ های با شناسه highlight

متد ()select_one

در شکل و کد زیر می خواهیم تنها تگ a درون تگ center درون تگ div درون تگ body درون تگ html را بدست آوریم. الگوی دسترسی که در بالا و با فاصله گذاری میان تگ های پدر و فرزند گفته شده، حالت ساختار درختواره در اچ تی ام ال است. در کد زیر به دو شیوه و بوسیله متد ()get_text به متن تگ a دسترسی پیدا کرده ایم. در هر دو از متد ()select_one برای دسترسی به تنها یک تگ استفاده شده است و در حالت یکم از ساختار درختواره کوتاه شده و در حالت دوم از ساختار درختواره تمام کمک گرفته شده است.

با توجه به نمونه مثال هایی که در بالا توضیح دادیم، و به دلیل اینکه در شکل بالا تگ a درون تگ div یا درون تگ center وجود دارد، پس مطابق کد شکل زیر نیز می توانیم به متن تگ a دسترسی پیدا کنیم. توجه کنید که در سمت چپ و راست با کاراکتر < تنها و تنها باید یک فاصله یا فضای خالی وجود داشته باشد.

پیدا کردن تمامی لینک های صفحه خانگی news.ycombinator.com

در کد شکل زیر توسط متد ()select می خواهیم فهرست تمامی لینک های صفحه خانگی سایت news.ycombinator.com را بدست آوریم به طوری که عنوان و لینک (خصوصیت href) هر لینک به صورت یک دیکشنری درون یک لیست ذخیره شود. در واقع می خواهیم لیستی از دیکشنری ها داشته باشیم که هر دیکشنری دارای دو کلید به نام title و href است.

در کدهای بالا اول از همه باید توسط متد ()select تمامی تگ های a درون تمامی تگ های td با کلاس title را انتخاب کنیم. خروجی متد ()select یک لیست پایتونی است، پس می توانیم درون حلقه for و در هر گام اول از همه خصوصیت href هر تگ a و سپس بوسیله متد ()get_text عنوان یا متن آن تگ a را به ترتیب درون متغیرهای href و title ذخیره کنیم و سپس بوسیله متد ()append از لبست ها و به صورت یک دیکشنری، دو کلید title و href از دیکشنری را مقدار دهی کنیم.

دانلود سورس برنامه این مطلب BS4 select and select_one