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

كيفية اختيار العناصر حسب الفئة في XPath: الدليل النهائي

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

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

خلاصة سريعة عن XPath

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

فيما يلي بعض الأشياء الأساسية التي يجب معرفتها حول XPath:

  • يعامل XPath المستند كبنية شجرة، مع عقدة جذر وعقد فرعية متفرعة منه
  • يتم تقييم التعبيرات من اليسار إلى اليمين
  • تُستخدم الخطوط المائلة للأمام (/) للتنقل بين العقد
  • يمكن تحديد العناصر بناءً على اسمها (على سبيل المثال //div يختار الكل <div> عناصر)
  • تسمح المسندات الموجودة بين قوسين مربعين بتحديد أكثر دقة (على سبيل المثال //div[@id=‘main‘] يختار <div> العناصر ذات المعرف "الرئيسي")

مع وجود هذا الأساس، دعونا نحول انتباهنا إلى الفئات وكيفية الاستفادة منها في تعبيرات XPath.

فهم فئات HTML

الفئات هي سمة HTML تسمح لك بتعيين اسم فئة واحد أو أكثر للعناصر. يتم استخدامها بشكل أساسي لأغراض التصميم باستخدام CSS، ولكنها أيضًا مفيدة جدًا لاستهداف عناصر محددة عند تجريف الويب.

فيما يلي مثال لعنصر فقرة يحتوي على فئتين:

<p class="highlight text-center">This is some text.</p>

في هذه الحالة ، فإن <p> يحتوي العنصر على فئتين مطبقتين عليه: "تسليط الضوء" و"مركز النص". يمكن أن يحتوي العنصر على أي عدد من الفئات، والتي يتم فصلها بمسافات في قيمة سمة الفئة.

شيء واحد يجب أخذه في الاعتبار هو أن أسماء الفئات حساسة لحالة الأحرف. لذا class="highlight" و class="Highlight" سيتم اعتبار فئتين مختلفتين.

الآن بعد أن فهمنا ما هي فئات HTML، دعونا ننظر في كيفية تحديد العناصر بناءً على فئاتها باستخدام XPath.

اختيار العناصر حسب الفئة في XPath

يوفر XPath طريقتين رئيسيتين لتحديد العناصر حسب سمة الفئة الخاصة بها:

  1. باستخدام الدالة تحتوي على ().
  2. المطابقة الدقيقة لاسم الفئة

دعونا نستكشف كل من هذه الأساليب بمزيد من التعمق.

النهج 1: استخدام وظيفة تحتوي على ().

contains() تتيح لك الوظيفة تحديد العناصر التي تتميز بصفتها يحتوي اسم فئة معينة. وهنا بناء الجملة الأساسي:

//element[contains(@class,‘classname‘)]

على سبيل المثال، لتحديد الكل <div> العناصر التي تحتوي على فئة "الحاوية"، يمكنك استخدامها:

//div[contains(@class,‘container‘)]  

contains() تتميز الوظيفة ببعض الخصائص الرئيسية:

  • إنها حساسة لحالة الأحرف (لذا سيتم التعامل مع "الحاوية" و"الحاوية" على أنهما مختلفان)
  • يمكن أن يظهر اسم الفئة في أي مكان في قيمة سمة الفئة
  • يمكن أن يتم تطبيق فئات أخرى أيضًا على العنصر، طالما أنه يحتوي على الفئة المحددة

So contains(@class,‘container‘) سوف تتطابق مع عناصر مثل:

<div class="container"></div>
<div class="wrapper container card"></div>
<div class="container highlighted"></div>

ولكن من شأنه ليس اللعبة:

<div class="containery"></div>
<div class="wrapper"></div>

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

النهج 2: المطابقة الدقيقة لاسم الفئة

لتحديد العناصر التي لها سمة فئة ذلك بالضبط يطابق قيمة محددة، يمكنك استخدام بناء الجملة هذا:

//element[@class=‘classname‘]

على سبيل المثال، لتحديد <p> العناصر التي يكون فيها الفصل هو "تسليط الضوء" تمامًا، يمكنك استخدام:

//p[@class=‘highlight‘]

هذا التعبير سوف يطابق:

<p class="highlight"></p>  

لكن لا:

<p class="highlight text-center"></p>
<p class="highlights"></p>
<p class="Highlight"></p>

كما ترون، فإن أسلوب المطابقة التامة أكثر صرامة. يجب أن تحتوي سمة الفئة فقط اسم الفئة المحددة من أجل المطابقة. لا يمكن أن تكون هناك فئات أخرى، ويجب أن تتطابق الحالة تمامًا.

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

XPath والفئات - الاعتبارات الأساسية

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

  • أسماء الفئات حساسة لحالة الأحرف. كما ذكرنا سابقًا، يتم التعامل مع "highlight" و"Highlight" كأسماء فئات مختلفة. تأكد من أن تعبيرات XPath تتطابق مع حالة الأحرف تمامًا.

  • يمكن أن تحتوي العناصر على فئات متعددة. من الشائع جدًا أن يتم تطبيق أكثر من فئة على العناصر، مفصولة بمسافات. ال contains() سيطابق النهج العناصر طالما أنها تحتوي على الفئة المحددة في مكان ما في سمة الطبقة الخاصة بهم.

  • المطابقة التامة أكثر دقة ولكنها أقل مرونة. إذا كنت تستخدم [@class=‘classname‘]، يجب أن تكون سمة الفئة فقط تحتوي على تلك الفئة. إذا تم تطبيق فئات أخرى، فلن تتم مطابقة العنصر. في المقابل، contains(@class,‘classname‘) سوف يتطابق طالما أن الفئة تظهر في مكان ما في قيمة السمة.

  • يتم دعم XPath بواسطة معظم أدوات ومكتبات تجريف الويب. سواء كنت تستخدم Python مع BeautifulSoup أو Scrapy، أو JavaScript مع Puppeteer أو Cheerio، أو لغة/إطار عمل آخر، فمن المحتمل أن تكون قادرًا على استخدام تعبيرات XPath لاستخراج البيانات. يظل بناء جملة اختيار الفصل كما هو.

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

أفضل الممارسات والنصائح الخاصة بمحدد الفئة

للحصول على أقصى استفادة من محددات فئة XPath، خذ بعين الاعتبار أفضل الممارسات والنصائح التالية:

  • استخدم أبسط التعبير الذي ينجز المهمة. في بعض الأحيان بسيطة //element[@class=‘classname‘] هو كل ما تحتاجه. تجنب التعقيد غير الضروري.

  • قم بدمج محددات الفئة مع معايير أخرى عند الحاجة. يمكنك استخدام المسندات لتحديد العناصر بناءً على سمات متعددة (على سبيل المثال //button[@class=‘primary‘ and @type=‘submit‘])، أو دمج محددات الفئة مع المحددات الموضعية (على سبيل المثال (//div[@class=‘row‘])[2] لتحديد الصف الثاني).

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

  • استخدم مسارات XPaths النسبية لتجنب تكرار التعبيرات الطويلة. إذا قمت بالفعل بتحديد عنصر أصل، فيمكنك استخدام النقطة (.) لتحديد الأطفال بالنسبة لهذا العنصر، مثل //div[@class=‘container‘]/./p.

  • فكر في طرق أخرى مثل محددات CSS أو التعبير العادي لحالات استخدام محددة. على الرغم من أن XPath متعدد الاستخدامات، فقد تكون هناك أوقات يكون فيها الأسلوب الآخر أبسط أو أسرع. تعتبر محددات CSS فعالة ومناسبة تمامًا لمهام الاختيار الأساسية. يمكن أن تكون التعبيرات العادية مفيدة لمطابقة الأنماط أو استخراج البيانات من محتوى النص.

أمثلة على اختيار الفصل

دعونا نستعرض بعض الأمثلة على اختيار الفصل أثناء العمل باستخدام Python و lxml مكتبة.

لنفترض أن لدينا HTML هذا:

<html>
    <body>
        <div class="container">
            <p class="highlight">Paragraph 1</p>
            <p>Paragraph 2</p>
            <p class="highlight">Paragraph 3</p>
        </div>
    </body>  
</html>

لتحديد الكل <p> عناصر ذات فئة "تسليط الضوء"، يمكننا استخدامها contains():

from lxml import html

tree = html.fromstring(html_string)
highlighted_paragraphs = tree.xpath(‘//p[contains(@class,"highlight")]‘)

for paragraph in highlighted_paragraphs:
    print(paragraph.text)

# Output: 
# Paragraph 1
# Paragraph 3

إذا أردنا تحديد فقط <p> العناصر التي يوجد فيها الفصل بالضبط "تسليط الضوء"، سوف نستخدم:

exact_match_paragraphs = tree.xpath(‘//p[@class="highlight"]‘)

لتحديد ملف <div> العنصر ومن ثم العثور عليه <p> العناصر التي تحتوي على فئة "تسليط الضوء" بداخلها، يمكننا استخدام XPath نسبي:

div = tree.xpath(‘//div[@class="container"]‘)[0]
highlighted_paragraphs = div.xpath(‘./p[contains(@class,"highlight")]‘)

وضع كل ذلك معا

في هذا الدليل، ألقينا نظرة متعمقة على كيفية تحديد العناصر حسب الفئة باستخدام XPath. لقد قمنا بتغطية الطريقتين الرئيسيتين - استخدام الدالة يحتوي على () والمطابقة الدقيقة لاسم الفئة - بالإضافة إلى الاعتبارات الأساسية وأفضل الممارسات والأمثلة.

كي تختصر:

  • XPath هي لغة استعلام قوية لتحديد العناصر في مستندات HTML/XML
  • الفئات هي طريقة لتعيين فئات للعناصر، غالبًا لأغراض التصميم أو الاختيار
  • contains(@class,‘classname‘) يختار الأسلوب العناصر التي تحتوي على الفئة المحددة كجزء من قيمة سمة الفئة الخاصة بها
  • [@class=‘classname‘] يختار الأسلوب العناصر التي تتطابق فيها سمة الفئة تمامًا مع الفئة المحددة
  • تعتبر محددات فئة XPath حساسة لحالة الأحرف ويمكن دمجها مع معايير أخرى أو محددات نسبية
  • من المهم اختيار أبسط تعبير يحقق هدفك وأن تضع في اعتبارك التغييرات التي تطرأ على HTML الخاص بالموقع بمرور الوقت

مسلحًا بهذه المعرفة، أنت مجهز جيدًا للتعامل مع مجموعة واسعة من تحديات تجريف الويب باستخدام XPath ومحددات الفصل الدراسي. سواء كنت مبتدئًا أو محترفًا متمرسًا، فإن فهم كيفية استهداف العناصر التي تحتاجها بدقة يعد مهارة أساسية.

أثناء تطبيق هذه التقنيات، تذكر دائمًا احترام مالكي مواقع الويب والالتزام بأي شروط خدمة سارية أو ملفات robots.txt. تجريف سعيد!

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

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