تحليل HTML باستخدام BeautifulSoup
find() وselect() ومحددات CSS واستخراج المحتوى المنظم من HTML
تحليل HTML باستخدام BeautifulSoup درس مجاني في AI Agents على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في AI Agents، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة AI Agents 4 دروس في المجموع.
لماذا نحلل HTML في الوكلاء؟
لا تأتي مصادر بيانات كثيرة على شكل واجهات API، بل تكون صفحات ويب. وعندما يحتاج وكيل إلى استخراج معلومات منظمة من HTML، يجب عليه تحليل الترميز الخام وتحويله إلى شجرة يمكن التنقل فيها.
تُعد BeautifulSoup (bs4) مكتبة Python القياسية لهذا الغرض. فهي تحوّل HTML غير المنظم إلى كائن Python يمكنك الاستعلام عنه بسهولة.
إنشاء كائن BeautifulSoup
مرّر HTML الخام واسم محلل إلى BeautifulSoup(). فالمحلل 'html.parser' مضمّن في Python ولا يتطلب تثبيتًا إضافيًا. ولتحليل الصفحات الكبيرة بسرعة أكبر، يتوفر 'lxml' عبر pip.
from bs4 import BeautifulSoup
import httpx
# Fetch HTML
response = httpx.get('https://example.com', timeout=10.0)
html = response.text
# Parse it
soup = BeautifulSoup(html, 'html.parser')
# Get the page title
print(soup.title.text) # 'Example Domain'find() — العثور على عنصر واحد
تُرجع soup.find(tag, attrs) أول عنصر مطابق، أو None إذا لم يُعثر على أي عنصر. ويمكنك المطابقة حسب اسم الوسم أو الفئة أو المعرّف أو أي سمة.
تحقق دائمًا من None قبل استدعاء الأساليب على النتيجة.
from bs4 import BeautifulSoup
html = '<div class="content"><h1>Title</h1><p>Body text here.</p></div>'
soup = BeautifulSoup(html, 'html.parser')
# Find by tag + class
content_div = soup.find('div', class_='content')
if content_div:
heading = content_div.find('h1')
print(heading.text) # 'Title'
# Find by id
sidebar = soup.find('div', id='sidebar') # None if absentfind_all() — العثور على عدة عناصر
تُرجع soup.find_all(tag) قائمة بجميع العناصر المطابقة. كرّر عبرها لاستخراج البيانات من البُنى المتكررة، مثل عناصر القوائم أو صفوف الجداول أو بطاقات المقالات.
from bs4 import BeautifulSoup
html = '<ul><li>Apple</li><li>Banana</li><li>Cherry</li></ul>'
soup = BeautifulSoup(html, 'html.parser')
items = soup.find_all('li')
for item in items:
print(item.text) # Apple, Banana, Cherry
# Limit results
first_two = soup.find_all('li', limit=2)محدّدات CSS باستخدام select()
تتيح لك soup.select('css selector') استخدام صياغة CSS المألوفة. وغالبًا ما تكون هذه الطريقة أكثر اختصارًا من استدعاءات find() المتسلسلة، خصوصًا مع العناصر المتداخلة.
from bs4 import BeautifulSoup
html = '''
<table>
<tr><td class="name">Alice</td><td class="score">95</td></tr>
<tr><td class="name">Bob</td><td class="score">87</td></tr>
</table>
'''
soup = BeautifulSoup(html, 'html.parser')
# Select all td elements inside tr inside table
cells = soup.select('table tr td')
for cell in cells:
print(cell.text)
# Select only name cells
names = soup.select('td.name')
for n in names:
print(n.text) # Alice, Bobاستخراج النص باستخدام .text و.strip()
تُرجع .text (أو .get_text()) كل المحتوى النصي داخل عنصر، بما في ذلك الوسوم المتداخلة. استخدم .strip() لإزالة المسافات البيضاء في البداية والنهاية، التي غالبًا ما يحتوي عليها HTML.
from bs4 import BeautifulSoup
html = '<p> \n Price: <strong>$29.99</strong> \n </p>'
soup = BeautifulSoup(html, 'html.parser')
paragraph = soup.find('p')
# .text includes nested tag content
print(paragraph.text) # ' \n Price: $29.99 \n '
print(paragraph.text.strip()) # 'Price: $29.99'
# get_text with separator
print(paragraph.get_text(separator=' ', strip=True)) # 'Price: $29.99'استخراج السمات باستخدام .get()
يمكن الوصول إلى سمات الوسوم، مثل href وsrc وdata-*، كما لو كانت قاموسًا باستخدام .get('attr_name'). وتُرجع هذه الطريقة بأمان القيمة None إذا كانت السمة مفقودة.
from bs4 import BeautifulSoup
html = '''
<a href="https://example.com/page" data-id="42">Click here</a>
<img src="/images/logo.png" alt="Logo">
'''
soup = BeautifulSoup(html, 'html.parser')
link = soup.find('a')
print(link.get('href')) # 'https://example.com/page'
print(link.get('data-id')) # '42'
print(link.get('class')) # None (no class attribute)
img = soup.find('img')
print(img.get('src')) # '/images/logo.png'التنقل في شجرة التحليل
تملك عناصر BeautifulSoup علاقات بين العناصر الأصلية والفرعية والأشقاء، ويمكنك اجتيازها. استخدم .parent و.children و.next_sibling و.previous_sibling للتنقل حول عنصر عثرت عليه.
from bs4 import BeautifulSoup
html = '''
<div class="article">
<h2>Headline</h2>
<p>First paragraph.</p>
<p>Second paragraph.</p>
</div>
'''
soup = BeautifulSoup(html, 'html.parser')
h2 = soup.find('h2')
print(h2.text) # 'Headline'
print(h2.parent['class']) # ['article']
print(h2.next_sibling.next_sibling.text) # 'First paragraph.'استخراج جميع الروابط من صفحة
من مهام الوكيل الشائعة جمع جميع الروابط من صفحة لمواصلة الزحف. اعثر على جميع وسوم <a> واستخرج سمات href الخاصة بها، مع تصفية السمات الفارغة.
from bs4 import BeautifulSoup
import httpx
def extract_links(url: str) -> list:
response = httpx.get(url, timeout=10.0)
soup = BeautifulSoup(response.text, 'html.parser')
links = []
for tag in soup.find_all('a'):
href = tag.get('href')
if href and href.startswith('http'):
links.append(href)
return links
# urls = extract_links('https://news.ycombinator.com')
# print(urls[:5])التعامل مع HTML غير السليم بسلاسة
غالبًا ما يكون HTML في العالم الحقيقي غير سليم: وسوم غير مغلقة، وعناصر غير متطابقة، ومشكلات في الترميز. محلل BeautifulSoup متسامح، وسيحاول إصلاح الأخطاء تلقائيًا. لكن احرص دائمًا على التعامل مع None عند الوصول إلى العناصر المتداخلة.
from bs4 import BeautifulSoup
# Broken HTML — missing closing tags
html = '<div><p>Hello <strong>World</div>'
soup = BeautifulSoup(html, 'html.parser')
# BS4 repairs the tree automatically
print(soup.prettify())
# <div><p>Hello <strong>World</strong></p></div>
# Safe chained access
price = soup.find('span', class_='price')
price_text = price.text.strip() if price else 'N/A'
print(price_text) # 'N/A'أداة كشط متكاملة لوكيل
إليك تجميعًا لكل ما سبق: دالة كشط متكاملة يمكن للوكيل استدعاؤها كأداة. فهي تجلب صفحة، وتحللها، وتُرجع بيانات منظمة بتنسيق يستطيع الوكيل الاستدلال منه.
from bs4 import BeautifulSoup
import httpx
def scrape_article(url: str) -> dict:
response = httpx.get(url, headers={'User-Agent': 'MyAgent/1.0'}, timeout=10.0)
response.raise_for_status()
soup = BeautifulSoup(response.text, 'html.parser')
title = soup.find('h1')
paragraphs = soup.find_all('p')
return {
'url': url,
'title': title.text.strip() if title else '',
'text': ' '.join(p.text.strip() for p in paragraphs[:5]),
'links': [a.get('href') for a in soup.find_all('a', href=True)][:10]
}اختبار المعرفة: BeautifulSoup
اختبروا فهمكم لتحليل HTML باستخدام BeautifulSoup.
مراجعة: تحليل HTML باستخدام BeautifulSoup
يمكنكم الآن استخراج البيانات المنظّمة من صفحات HTML داخل وكلائكم:
- أنشئوا كائن soup باستخدام
BeautifulSoup(html, 'html.parser') - استخدموا
find()لعنصر واحد، وfind_all()لعناصر متعددة - استخدموا
select()للاستعلامات باستخدام محددات CSS - احصلوا على النص باستخدام
.text.strip()وعلى السمات باستخدام.get('attr') - تنقّلوا في الشجرة باستخدام
.parentو.childrenوالعناصر الشقيقة
بالجمع بين BeautifulSoup وعميل HTTP، يصبح وكيلكم قادرًا على قراءة أي صفحة ويب.
الأسئلة الشائعة
هل درس «تحليل HTML باستخدام BeautifulSoup» مجاني؟
نعم — نص درس «تحليل HTML باستخدام BeautifulSoup» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة AI Agents، انتقل إلى CoddyKit PRO. تتضمن دورة AI Agents 4 دروس في المجموع.
ماذا ستتعلم في «تحليل HTML باستخدام BeautifulSoup»؟
find() وselect() ومحددات CSS واستخراج المحتوى المنظم من HTML تتمرن على AI Agents مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ AI Agents؟
لا تُشترط خبرة سابقة. AI Agents على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «تحليل HTML باستخدام BeautifulSoup»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس AI Agents هذا؟
نعم. كل درس في AI Agents يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- عملاء HTTP للوكلاء: httpx وrequests
- تحليل HTML باستخدام BeautifulSoup
- التعامل مع ترقيم الصفحات والمحتوى الديناميكي
- ممارسات الاستخلاص المسؤولة