0Pricing
Python Academy · درس

تحليل 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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. طلبات HTTP باستخدام requests وhttpx
  2. تحليل HTML باستخدام BeautifulSoup
  3. بناء عنكبوت Scrapy
  4. التعامل مع JavaScript وإجراءات مكافحة الكشط
← العودة إلى Python Academy