انتقل إلى المحتوى

كيفية استخدام محددات XPath لتجريد الويب في بايثون

إذا كنت تتطلع إلى استخراج البيانات من صفحات الويب باستخدام Python، فإن XPath يعد أداة أساسية في مجموعة أدوات تجريف الويب الخاصة بك. يوفر XPath طريقة للتنقل عبر بنية HTML للصفحة وتحديد العناصر والبيانات التي تحتاجها بدقة.

في هذا الدليل، سنتعرف على أساسيات XPath ونوضح كيف يمكنك الاستفادة من قوته في استخراج بيانات الويب باستخدام Python. في النهاية، ستكون جاهزًا للتعامل مع مجموعة واسعة من مهام التجريد باستخدام XPath لاستخراج البيانات التي تبحث عنها جراحيًا.

ما هو XPath؟

يرمز XPath إلى لغة مسار XML. إنها لغة استعلام لتحديد العقد من مستند XML أو HTML. باستخدام XPath، يمكنك تحديد نمط لمطابقته مع بنية المستند، وسيقوم بإرجاع كافة العناصر التي تطابق هذا النمط.

على الرغم من أنه مصمم في الأصل لـ XML، إلا أن XPath يعمل أيضًا مع HTML، مما يجعله مثاليًا لأغراض تجريد الويب. فهو يوفر بديلاً أكثر قوة ومرونة لمحددات CSS أو التعبيرات العادية.

أساسيات بناء جملة XPath

لبدء استخدام XPath، ستحتاج إلى فهم العناصر الأساسية لبناء جملة XPath. فيما يلي المفاهيم الأساسية:

اختيار العقد حسب اسم العلامة

أبسط تعبير XPath هو تحديد اسم العلامة ببساطة. على سبيل المثال:

  • //h1 يختار كل <h1> عناصر العنوان في الصفحة
  • //p يختار كل <p> عناصر الفقرة
  • //img يختار كل <img> عناصر الصورة

اختيار العقد حسب السمة

يمكنك تحديد العناصر التي لها سمة أو قيمة سمة محددة باستخدام @ بناء الجملة:

  • //*[@class="highlighted"] تحديد جميع العناصر التي تحتوي على الفئة "المميزة"
  • //a[@href] يختار الكل <a> عناصر الربط التي لها سمة href
  • //img[@alt="Logo"] يختار <img> عناصر تحتوي على نص بديل "الشعار"

اختيار العقد حسب الموضع

يمكنك تحديد العقد بناءً على موضعها باستخدام الأقواس المربعة [] والفهرس الرقمي:

  • //ul/li[1] يختار الأول <li> البند داخل كل <ul> قائمة غير مرتبة
  • //table/tr[last()] يختار الأخير <tr> صف في كل <table>
  • //ol/li[position() <= 3] يختار الثلاثة الأولى <li> العناصر في كل <ol> قائمة مرتبة

اختيار العقد حسب العلاقة

يتيح لك XPath التنقل لأعلى ولأسفل في شجرة المستندات لتحديد العناصر بناءً على أسلافهم وأحفادهم وإخوتهم وما إلى ذلك:

  • //div[@class="content"]/* يختار كافة العناصر التابعة ل <div> العناصر ذات "محتوى" الفئة
  • //p/.. يختار العناصر الأصل للجميع <p> الفقرات
  • //h1/following-sibling::p يختار الكل <p> العناصر التي هي أشقاء بعد <h1> عنوان
  • //section//img يختار الكل <img> العناصر التي هي من نسل أ <section> على أي مستوى

المسندات والوظائف

يدعم XPath مجموعة واسعة من المسندات والوظائف لتحسين اختياراتك بشكل أكبر:

  • //p[contains(text(),"scrapy")] يختار <p> العناصر التي تحتوي على النص "scrapy"
  • //a[starts-with(@href,"https")] يختار <a> العناصر التي يبدأ فيها href بـ "https"
  • //ul[count(li) > 10] يختار <ul> العناصر التي تحتوي على أكثر من 10 <li> العناصر
  • //img[string-length(@alt) > 0] يختار <img> العناصر ذات السمة البديلة غير الفارغة

استخدام XPath مع lxml وBeautifulSoup

الآن بعد أن فهمت أساسيات بناء جملة XPath، دعنا نرى كيف يمكنك استخدامه في Python مع مكتبات lxml وBeautifulSoup الشهيرة. سنستعرض مثالاً على استخراج نص العنوان الرئيسي من الصفحة الرئيسية لـ ScrapingBee.

تحليل HTML باستخدام lxml وBeautifulSoup

أولاً، نحتاج إلى جلب HTML لصفحة الويب باستخدام مكتبة الطلبات وتحليلها إلى بنية شجرة يمكننا الاستعلام عنها باستخدام XPath. سوف نستخدم BeautifulSoup لتحليل HTML وlxml لتقييم تعبيرات XPath الخاصة بنا:

import requests
from bs4 import BeautifulSoup
from lxml import etree

html = requests.get("https://scrapingbee.com") 
soup = BeautifulSoup(html.text, "html.parser")
dom = etree.HTML(str(soup))

نحن هنا:

  1. جلب HTML باستخدام requests.get()
  2. قم بتحليل سلسلة HTML إلى كائن BeautifulSoup باستخدام html.parser
  3. قم بتحويل كائن BeautifulSoup إلى سلسلة حتى نتمكن من تحليله باستخدام lxml etree.HTML() وظيفة
  4. تحليل السلسلة إلى ملف lxml Element كائن يمكننا الاستعلام عنه باستخدام XPath

بناء وتقييم تعبيرات XPath

الآن بعد أن أصبح لدينا شجرة HTML تم تحليلها، يمكننا إنشاء تعبير XPath لتحديد العنصر الرئيسي <h1> العنوان في الصفحة:

heading_xpath = ‘//h1‘

لتقييم XPath هذا مقابل مستند HTML الذي تم تحليله، نستخدم التابع xpath() الأسلوب:

heading_elements = dom.xpath(heading_xpath)

dom.xpath() call سيُرجع قائمة بجميع العناصر المطابقة لمحدد XPath الخاص بنا. في هذه الحالة، يجب أن يكون هناك مطابقة واحدة فقط <h1> جزء.

استخراج النص والسمات

بمجرد حصولنا على مرجع للعنصر، يمكننا بسهولة استخراج نصه وأي سمات باستخدام خصائص lxml:

heading_text = heading_elements[0].text
print(heading_text)
# Tired of getting blocked while scraping the web?  

لقد نجحنا في استخراج نص العنوان بسطر واحد فقط من XPath! يمكننا أيضًا الوصول إلى قيم السمات الخاصة بالعنصر باستخدام get():

heading_id = heading_elements[0].get(‘id‘)  

استخدام XPath مع السيلينيوم

هناك طريقة بديلة تتمثل في استخدام السيلينيوم لأتمتة وإزالة مواقع الويب الديناميكية التي تتطلب JavaScript. يوفر السيلينيوم طرقه الخاصة لاختيار العناصر باستخدام سلاسل XPath.

تكوين السيلينيوم WebDriver

للبدء في استخدام السيلينيوم، تحتاج أولاً إلى تثبيت حزمة السيلينيوم وبرنامج تشغيل الويب للمتصفح الذي تريد استخدامه. إليك كيفية تكوين برنامج تشغيل Chrome:

from selenium import webdriver
from selenium.webdriver.common.by import By

driver_path = "/path/to/chromedriver"  
driver = webdriver.Chrome(driver_path)

تأكد من تنزيل إصدار ChromeDriver المناسب لتثبيت Chrome الخاص بك وتوفير المسار إلى الملف القابل للتنفيذ.

البحث عن العناصر باستخدام XPath

بعد تكوين برنامج التشغيل، يمكننا الانتقال إلى صفحة ويب والبدء في العثور على العناصر. يوفر WebDriver الخاص بالسيلينيوم find_element الطريقة التي تقبل محدد موقع XPath:

driver.get("https://scrapingbee.com")

heading_xpath = "//h1"
heading_element = driver.find_element(By.XPATH, heading_xpath)

على غرار مثال lxml، سيبحث هذا عن الأول <h1> عنصر على الصفحة. إذا كنت تريد العثور على جميع العناصر المطابقة لـ XPath، فاستخدم find_elements في حين أن:

paragraph_xpath = "//p"
paragraph_elements = driver.find_elements(By.XPATH, paragraph_xpath)  

استخراج النص والسمات

بمجرد حصولك على مرجع لعنصر الويب، يمكنك الوصول إلى خصائصه مثل محتوى النص وسماته:

heading_text = heading_element.text
print(heading_text)  
# Tired of getting blocked while scraping the web?

paragraph_id = paragraph_elements[0].get_attribute("id")

يعد استخراج البيانات باستخدام Selenium وXPath أمرًا بسيطًا للغاية، ولكن ضع في اعتبارك أن السيلينيوم أبطأ بشكل عام من استخدام مكتبة طلبات HTTP العادية نظرًا لأنه يقوم بتشغيل متصفح فعلي.

النصائح وأفضل الممارسات

عندما تبدأ في استخدام XPath لتجميع بيانات الويب، إليك بعض النصائح والحيل التي يجب وضعها في الاعتبار:

استخدم Chrome DevTools لاختبار تعبيرات XPath

عند إنشاء محددات XPath، من المفيد جدًا اختبارها بشكل تفاعلي للتأكد من مطابقتها لما تتوقعه. توفر Chrome DevTools طريقة سهلة للقيام بذلك:

  1. انقر بزر الماوس الأيمن على أحد العناصر وحدد "فحص" لفتح لوحة DevTools Elements
  2. اضغط على Ctrl+F لفتح مربع البحث
  3. أدخل تعبير XPath الخاص بك لتمييز العناصر المطابقة في الصفحة

التعامل مع العلامات غير المتناسقة

غالبًا ما تحتوي مواقع الويب الموجودة على علامات HTML غير متسقة أو معطلة والتي يمكن أن تؤدي إلى تعثر محددات XPath الخاصة بك. من الجيد استخدام مكتبة مثل BeautifulSoup لتنظيف HTML وتطبيعه قبل تحليله باستخدام lxml.

اكتب XPath قويًا وقابلاً للصيانة

لتقليل فرص تعطل أداة الكشط الخاصة بك بسبب تغييرات التخطيط على الموقع المستهدف، حاول كتابة تعبيرات XPath المحددة قدر الإمكان ولكنها ليست أكثر تحديدًا من اللازم. فضل الاختيار حسب الخصائص الدلالية مثل أسماء العلامات والمعرفات وسمات البيانات بدلاً من الاعتماد على البنية المحددة للترميز.

من المفيد أيضًا تقسيم تعبيرات XPath المعقدة إلى متغيرات بأسماء وصفية لتحسين إمكانية القراءة وقابلية الصيانة.

نتائج ذاكرة التخزين المؤقت لتحسين الأداء

إذا كنت تقوم باستخلاص كميات كبيرة من البيانات أو الوصول إلى نفس الصفحات عدة مرات، ففكر في تخزين نتائج HTML وXPath التي تم تحليلها مؤقتًا لتجنب طلبات الشبكة غير الضرورية والتحليل الزائد. يمكنك استخدام قاموس بسيط أو حل أكثر قوة مثل MongoDB أو Redis للتخزين المؤقت.

وفي الختام

XPath هي أداة قوية بشكل لا يصدق لاستخراج البيانات بدقة من صفحات HTML. من خلال الفهم الأساسي للتركيب والقدرة على ترجمة محددات CSS إلى مكافئاتها في XPath، يمكنك التعامل مع مجموعة واسعة من مهام تجريف الويب.

توفر مكتبات Python مثل lxml وBeautifulSoup وSelenium طرقًا سهلة لدمج XPath في سير عمل التجريد لديك. اعتمادا على احتياجاتك المحددة وخصائص الموقع المستهدف، يمكنك اختيار النهج الذي يعمل بشكل أفضل.

أثناء مواصلتك رحلة استخراج الويب باستخدام Python وXPath، تأكد دائمًا من احترام شروط خدمة موقع الويب وقيود ملف robots.txt. وتذكر أن تصقل أساسيات وظائف XPath وعوامل التشغيل - ستندهش من مدى ما يمكنك تحقيقه باستخدام بضعة أسطر فقط من XPath الذكي!

الانضمام إلى محادثة

لن يتم نشر عنوان بريدك الإلكتروني. الحقول المشار إليها إلزامية *