کلاس BeautifulSoup دارای یک سری از متدها است که برای پیدا کردن تمامی تگ ها استفاده می شوند. متد ()find نام یک تگ را دریافت می کند و سپس اولین تگ معادل درون صفحه را بر می گرداند و متدهای ()findAll و ()find_all نیز نام یک تگ و در صورت نیاز نام یک خصوصیت (attribute) را دریافت و سپس تمامی تگ های معادل را بر می گرداند.

به طور مثال در این لینک که فهرست تمامی زنان فضانورد را نشان می دهد می خواهیم نام آنها را از اولین جدول نمایش دهیم. برای این منظور می توانیم از متد ()find استفاده کنیم. در قطعه کد زیر ابتدا محتوای لینک توسط متد ()urloprn خوانده شده و سپس رشته table به متد ()find ارسال شده است تا اولین جدول درون صفحه وب برگشت داده شود. در این مطلب در مورد متد ()find صحبت کرده ایم و در مطلب های پیش رو در مورد متدهای دیگری به نام ()find_all و ()findAll صحبت شده است. همچنین در مطلب های دیگر متدی به نام ()select برای انتخاب تگ ها بر اساس CSS ها آموزش داده شده است.

خروجی متد ()find که درون متغیری به نام female_spacefarers ذخیره شده است که از نوع کلاس bs4.element.Tag است. بنابراین متغیر female_spacefarers حاوی تگ های tr, th و td و دیگر تگ ها مانند تگ a و تگ img و غیره است. به عبارت بهتر هر آنچه که درون نخستین تگ table درون صفحه وب باشد، در این متغیر وجود دارد. همچنین به یاد داشته باشید که در ویکی پدیا، جدول هایی که فهرست هایی در مورد آن مطلب (مثلا نام فضانوردان زن در این مطلب) را در خود نگه می دارند، کلاس (Class) آنها wikitable sortable نام دارد.

خروجی متد ()find که درون متغیری به نام female_spacefarers ذخیره شده است که از نوع کلاس bs4.element.Tag است. بنابراین متغیر female_spacefarers حاوی تگ های tr, th و td و دیگر تگ ها مانند تگ a و تگ img و غیره است. به عبارت بهتر هر آنچه که درون نخستین تگ table درون صفحه وب باشد، در این متغیر وجود دارد. همچنین به یاد داشته باشید که در ویکی پدیا، جدول هایی که فهرست هایی در مورد آن مطلب (مثلا نام فضانوردان زن در این مطلب) را در خود نگه می دارند، کلاس (Class) آنها wikitable sortable نام دارد.

اگر به شکل بالا نگاه کنید می بینید که خروجی خصوصیت contents از نوع لیست های پایتونی است و اندازه این لیست (متغیر female_spacefarers) برابر با 2 است. با توجه به شکل بالا عنصر اول آن کاراکتر n\ و عنصر دوم آن شامل تمامی تگ های درون تگ table می شود. توجه کنید که ما تگ table را به متد ()find فرستاده ایم. در شکل زیر خروجی ()print اول یک خط جدید (New Line یا کاراکتر n\) است و خروجی ()print دوم یک لیست از تمامی تگ های درون تگ table است.

اگر متد ()find نتواند چیزی را درون صفحه پیدا کند، مثلا می خواستیم اولین تگ strong را پیدا کند ولی کلا در صفحه تگ strong وجود ندرد، پس در این حالت None به عنوان خروجی برگشت داده می شود.

ساختار درختواره DOM و متد ()find

همانند آنچه که قبلا در مورد دنبال کردن ساختار درخت واره DOM توضیح دادیم، از متد ()find نیز می توانیم برای دنبال کردن ساختار درخت واره DOM استفاده کنیم. به طور مثال می خواهیم عنوان صفحه را بدست آوریم، پس به یکی از روش های زیر می توانیم این کار را انجام دهیمتوجه کنید که چون رابطه والدفرزندی میان تگ ها وجود دارد، پس می توانیم یکی از روش های زیر را برای رسیدن به یک تگ که خودش حتما فرزند تگ دیگری است، استفاده کنیم. soup نام یک نمونه (شی) از کلاس BeautifulSoup است.

پیدا کردن فهرست خصوصیت ها

همانطور که می دانید هر کدام از تگ های دارای یک سری خصوصیت های ویژه خودش و یک سری تگ های مشترک میان تمامی تگ ها است. در این بخش می خواهم به شما آموزش دهیم چگونه توسط خصوصیت attrs و متد ()find و مطابق کد زیر، بتوانیم فهرستی (لیستی) از خصوصیت های تگ فرستاده شده به متد ()find را بدست آوریم. به طور مثال در خروجی شکل زیر تنها یک خصوصیت و آنهم class تگ table برگشت داده شده است.

در کدهای بالا از دستور female_spacefarers_attrs = soup.find(‘table’).attrs برای پیدا کردن تمامی خصوصیت های یک تگ (در اینجا table) استفاده شده است. اما در دستور [‘female_spacefarers_class = soup.find(‘table’).attrs[‘class می خواهیم تنها مقدار خصوصیت class را پیدا کنیم.

دسترسی به تگ همراه با نام خصوصیت و مقدار آن

فرض کنید می خواهید به جدولی دسترسی داشته باشید که مقدار خصوصیت کلاس آن برابر با wikitable sortable باشد، پس باید مطابق کد زیر یک دیکشنری به عنوان پارامتر دوم به متد ()find بفرستیم که کلید دیکشنری نام خصوصیت و مقدار آن کلید، برابر با مقدار خصوصیت مورد نظر باشد.

دسترسی به تگ های درون تگ دیگر

کتابخانه bs4 دارای متدها و ویژگی های بسیاری است که انجام وب اسکرپینگ (Web Scraping) را ساده کرده است. توسط متد ()find می توانیم اولین تگ مورد نظر با مقداری برای یک یا چندین خصوصیت دلخواه تعریف شده در آن تگ را پیدا کنیم. فرض کنید می خواهیم به تمامی تگ های td درون تگ table در ویکی پدیا که پیش از این در متغیر female_spacefarers ذخیره کرده ایم دسترسی پیدا کنیم، پس برای این کار می توانیم از متدهای find_all_next() یا find_next() همانند کد زیر استفاده کنیم.

توجه کنید در کد بالا و از طریق متغیر female_spacefarers به متد ()find_all_next دسترسی پیدا کرده ایم و همچنین پارامتر اول آن رشته ای است که تگ td را مشخص می کند. همچنین می توانید همانند متد ()find، یک دیکشنری را به آرگومان دوم متدهای ()find_all_next و ()find_next بفرستید، تا تنها آن تگ های (در اینجا td) را پیدا کند که دارای آن خصوصیت های مورد دلخواه شما باشد. همچنین و به طور نمونه در این مطلب، متد ()find_all_next بر روی تمامی تگ های درون تگ table اجرا می شود ولی متد ()find_next تنها اولین تگ مطابق با ورودی را برگشت می دهد.

جدولی که در این مطلب استفاده کرده ایم دارای شش ستون است، بنابراین هر شش خروجی از شکل بالا، در واقع شش ستون متعلق به یک سطر از جدول بهرست فضانوردان خانم است. کتابخانه bs4 دو متد دیگر به نام های ()find_all_previous و()find_previous با عملکردی عکس متدهای بالا را نیز فراهم کرده است که می توانید از اینجا در مورد آنها بخوانید.

دانلود سورس برنامه های این مطلب find method in bs4