اذهب إلى المحتوى
  • 0

البحث عن نص داخل tag محدد باستخدام BeautifulSoup في بايثون

إياد أحمد

السؤال

Recommended Posts

  • 1

يمكنك اتباع الخطواط التالية:
أولاً: استيراد الوحدات اللازمة وهما bs4 و request. ثانياُ: تحديد الصفحة الهدف وإرسال طلب GET. ثالثاً:  تحديد ال tag المطلوب واستخدام الدالة findall لإيجاده. رابعاً:  تحديد النص الهدف. خامساً: للبحث عن نص داخل ال tag، نحتاج إلى التحقق من شرط الاحتواء بمساعدة ال string function، حيث أن  ال string function ستُرجع النص الموجود داخل ال tag. وبالتالي نختبر احتواءه ونطبعه في حالة تحقق الشرط. كما في الكود التالي:

# استيراد الوحدات
from bs4 import BeautifulSoup
import requests
# https://academy.hsoub.com/
# تحديد رابط الموقع الهدف 
url = 'https://academy.hsoub.com/learn/computer-science/'
# للصفحة GET إرسال طلب
page = requests.get(url)
# soup وإنشاء كائن BeautifulSoup تحليل مكونات الصفحة من خلال 
soup = BeautifulSoup(page.content, "html.parser")
# والبحث عنه tag تحديد ال
child_soup = soup.find_all('h2') 
# تحديد النص المطلوب
text = 'دورة علوم الحاسوب'
# سنبحث في العلامة التي يتطابق فيها النص مع النص المحدد 
for i in child_soup: 
	if(i.string in text):
		print(i)
# الخرج:
# <h2 class="no-margin clr-white font-bold">دورة علوم الحاسوب</h2>

في الكود السابق استخدمت حلقة for للبحث عن النص. وكحل بديل يمكنك استخدام lambda:

# استيراد الوحدات
from bs4 import BeautifulSoup
import requests
# تحديد رابط الموقع الهدف 
url = 'https://wiki.hsoub.com/?utm_source=academy.hsoub.com&utm_medium=Links&utm_campaign=HsoubFooter'
# للصفحة GET إرسال طلب 
page = requests.get(url)
# soup وإنشاء كائن BeautifulSoup تحليل مكونات الصفحة من خلال 
soup = BeautifulSoup(page.content, "html.parser")
# النص
text = 'Python'
TAG="a"
# عملية البحث نفسها لكن من خلال لمدا
res = soup.find_all(lambda tag: tag.name == TAG and text in tag.text)
# طباعة النتيجة
print(res)
# [<a href="/Python" title="Python">Python</a>]
تم التعديل في بواسطة Ali Haidar Ahmad
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1

في BeautifulSoup يمكن إستخدام التابع find أو find_all للبحث عن عنصر معين من خلال تمرير دالة كمعامل لهذا التابع، كالتالي:

import requests
from bs4 import BeautifulSoup

def check_content(tag):
    return tag.name=="h2" and "دورة" in tag.get_text()

user_input_url = 'https://academy.hsoub.com/store/c1-%D8%AF%D9%88%D8%B1%D8%A7%D8%AA-%D8%AA%D8%B9%D9%84%D9%8A%D9%85%D9%8A%D8%A9/'
website_content = requests.get(user_input_url.strip()).text
soup = BeautifulSoup(website_content, features='lxml')

print(soup.find_all(check_content))	# سيتم طباعة قائمة من العناصر التي تحتوي على كلمة 'دورة' في داخلها

لاحظ أن الدالة check_content يجب أن تقوم بإرجاع قيمة منطقية Boolean

الفرق بين find و find_all هو أن التابع find سقوم بإرجاع أول عنصر يجده، بينما التابع find_all سوف يقوم بإرجاع كل العناصر التي تنطبق عليها الشروط.

أيضًا يمكن إستعمال الأنماط التعبيرية regular expression للبحث عن النصوص بطريقة متقدمة أكثر، كالتالي:

import requests
from bs4 import BeautifulSoup
import re

user_input_url = 'https://academy.hsoub.com/store/c1-%D8%AF%D9%88%D8%B1%D8%A7%D8%AA-%D8%AA%D8%B9%D9%84%D9%8A%D9%85%D9%8A%D8%A9/'
website_content = requests.get(user_input_url.strip()).text

soup = BeautifulSoup(website_content, features='lxml')
h2_elements = soup.find_all('h2')	# تحديد كل عناصر h2

# سنتحقق من محتوى كل عنصر من عناصر h2 التي تم تحديدها 
for element in h2_elements:
    if element.find_all(text=re.compile("دورة")):	# إن كان محتوى العنصر يحتوي على الكلمة دورة
        print(element)

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...