تحليل HTML باستخدام BeautifulSoup
تنقّل في شجرة التحليل واستخرج البيانات باستخدام المحددات
تحليل HTML باستخدام BeautifulSoup درس مجاني في Python Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Python Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Python Academy 4 دروس في المجموع.
تثبيت BeautifulSoup
تُحلّل beautifulsoup4 مستندات HTML وXML. استخدم محلّل lxml للسرعة أو html.parser عند الرغبة في عدم الاعتماد على أي تبعيات.
# pip install beautifulsoup4 lxml
from bs4 import BeautifulSoup
html = "<h1>Hello</h1><p class='intro'>World</p>"
soup = BeautifulSoup(html, "lxml")
print(soup.h1.text) # Helloالعثور على العناصر
تعيد find(tag) العنصر المطابق الأول. وتعِيد find_all(tag) قائمة بجميع العناصر المطابقة.
from bs4 import BeautifulSoup
html = "<ul><li>A</li><li>B</li><li>C</li></ul>"
soup = BeautifulSoup(html, "lxml")
print(soup.find("li").text) # A
print([li.text for li in soup.find_all("li")]) # [A,B,C]محدّدات CSS
تستخدم soup.select("css selector") صيغة CSS. وتعِيد soup.select_one() المطابقة الأولى.
from bs4 import BeautifulSoup
html = '<div class="card"><a href="/p/1">Link 1</a></div>'
soup = BeautifulSoup(html, "lxml")
print(soup.select("div.card a")[0]["href"]) # /p/1
print(soup.select_one("a")["href"]) # /p/1الوصول إلى السمات
يمكنك الوصول إلى سمات الوسوم كما لو كانت قاموسًا: tag["href"] وtag.get("class", []).
from bs4 import BeautifulSoup
html = '<a href="https://example.com" class="link external">Click</a>'
soup = BeautifulSoup(html, "lxml")
a = soup.find("a")
print(a["href"]) # https://example.com
print(a.get("class", [])) # ['link', 'external']التنقل في شجرة التحليل
استخدم .parent و.children و.next_sibling و.previous_sibling للتنقل في الشجرة.
from bs4 import BeautifulSoup
html = "<div><h2>Title</h2><p>Para</p></div>"
soup = BeautifulSoup(html, "lxml")
h2 = soup.find("h2")
print(h2.parent.name) # div
print(h2.next_sibling.text) # Para (next sibling)استخراج النص
تعيد tag.get_text(separator=" ", strip=True) جميع النصوص الموجودة داخل الوسم، مع تنظيف المسافات البيضاء.
from bs4 import BeautifulSoup
html = "<div> <p>Hello</p> <p> World </p> </div>"
soup = BeautifulSoup(html, "lxml")
print(soup.div.get_text(separator=" ", strip=True))
# Hello Worldاستخراج البيانات باستخدام requests وBeautifulSoup
اجلب صفحة باستخدام requests وحلّلها باستخدام BeautifulSoup — إنهما الثنائي التقليدي لاستخراج البيانات.
import requests
from bs4 import BeautifulSoup
url = "https://books.toscrape.com"
r = requests.get(url, timeout=10)
soup = BeautifulSoup(r.text, "lxml")
titles = [h3.find("a")["title"] for h3 in soup.select("article.product_pod h3")]
print(titles[:3])معالجة عناوين URL النسبية
استخدم urllib.parse.urljoin(base, href) لتحويل الروابط النسبية إلى عناوين URL مطلقة.
from urllib.parse import urljoin
base = "https://example.com/products/"
href = "../about"
print(urljoin(base, href)) # https://example.com/aboutمعالجة الترميزات
يكتشف BeautifulSoup الترميز تلقائيًا، لكن يمكنك تحديده أو استخدام r.encoding من requests.
import requests
from bs4 import BeautifulSoup
r = requests.get("https://example.com")
print(r.encoding) # e.g. utf-8
soup = BeautifulSoup(r.content, "lxml", from_encoding=r.encoding)التعديل والتسلسل
عدّل شجرة التحليل وحوّلها مرة أخرى إلى HTML باستخدام str(tag) أو soup.prettify().
from bs4 import BeautifulSoup
html = "<p>Hello <b>world</b></p>"
soup = BeautifulSoup(html, "lxml")
soup.b.decompose() # remove the <b> tag
print(str(soup.p)) # <p>Hello </p>حدود BeautifulSoup
يحلّل BS4 لغة HTML الثابتة، لكنه لا يستطيع تنفيذ JavaScript. وللصفحات التي تُعرض باستخدام JS، استخدم Playwright أو Selenium.
# BeautifulSoup: good for static HTML
# Playwright: for JavaScript-rendered SPAs
# Scrapy: for large-scale crawls with pipelines
# pip install playwright
# playwright install
# from playwright.async_api import async_playwrightتحقق سريع
ما الأسلوب الذي يعيد جميع العناصر المطابقة لمحدّد CSS في BeautifulSoup؟
مراجعة
يحلّل BeautifulSoup لغة HTML في صورة شجرة قابلة للتنقل. استخدم find()/find_all() للبحث عن الوسوم، وselect() لمحدّدات CSS، وget_text() للحصول على نص نظيف. استخدمه مع requests للصفحات الثابتة، وPlaywright للمحتوى المعروض باستخدام JS.
الأسئلة الشائعة
هل درس «تحليل HTML باستخدام BeautifulSoup» مجاني؟
نعم — نص درس «تحليل HTML باستخدام BeautifulSoup» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Python Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Python Academy 4 دروس في المجموع.
ماذا ستتعلم في «تحليل HTML باستخدام BeautifulSoup»؟
تنقّل في شجرة التحليل واستخرج البيانات باستخدام المحددات تتمرن على Python Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Python Academy؟
لا تُشترط خبرة سابقة. Python Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «تحليل HTML باستخدام BeautifulSoup»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Python Academy هذا؟
نعم. كل درس في Python Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- طلبات HTTP باستخدام requests وhttpx
- تحليل HTML باستخدام BeautifulSoup
- بناء عنكبوت Scrapy
- التعامل مع JavaScript وإجراءات مكافحة الكشط