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

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

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

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

استخدام يحتوي على () لتحديد العناصر التي تحتوي على نص

XPath contains() تتيح لك الوظيفة تحديد العناصر التي تحتوي على سلسلة فرعية نصية محددة. ويأخذ حجتين:

  1. مجموعة عقدة للبحث داخلها
  2. السلسلة الفرعية النصية المراد مطابقتها

بناء الجملة يبدو مثل:

//element[contains(text(), "substring")]

سيؤدي هذا إلى تحديد الكل element العقد التي يحتوي محتواها النصي على المحدد substring.

على سبيل المثال ، ضع في اعتبارك HTML التالي:

<ul>
  <li>Apples</li>
  <li>Oranges</li>
  <li>Pears and Grapes</li>
</ul>

لتحديد الكل <li> العناصر التي تحتوي على النص "و"، يمكنك استخدامها:

//li[contains(text(), "and")]

وهذا من شأنه أن يطابق الثالث <li> عنصر "الكمثرى والعنب".

contains() تكون الوظيفة حساسة لحالة الأحرف بشكل افتراضي. لإجراء مطابقة غير حساسة لحالة الأحرف، يمكنك استخدام lower-case() or upper-case() وظائف لتطبيع الغلاف:

//li[contains(lower-case(text()), "and")]

سمة رئيسية من سمات contains() هو أن مطابقة السلسلة الفرعية يمكن أن تمتد عبر العناصر الفرعية. على سبيل المثال، في HTML هذا:

<p>
  Select <em>this</em> paragraph.
</p>

XPath //p[contains(text(), "Select this")] سيظل مطابقًا لـ <p> العلامة، على الرغم من أن "تحديد" و"هذا" مفصولان بعلامة <em> عنصر الطفل.

استخدام النص () لتحديد العناصر حسب النص الدقيق

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

الصيغة هي:

//element[text()="exact text"]

على سبيل المثال، مع HTML هذا:

<div>
  <p>Hello world!</p>
  <p>Hello again</p>
</div>

تعبير XPath //p[text()="Hello world!"] سيختار الأول فقط <p> عنصر. الثاني <p> العنصر غير متطابق، لأن محتوى النص الخاص به ليس بالضبط "Hello World!".

الغاء الاعجاب contains()أطلقت حملة text() تتطابق الوظيفة فقط مع محتوى النص المباشر للعنصر. لا يطابق النص داخل العناصر الفرعية. على سبيل المثال، //div[text()="Hello world!"] لن يتطابق مع أي شيء في HTML أعلاه، لأن <div> في حد ذاته لا يحتوي مباشرة على النص "Hello World!". هذا النص داخل <p> عنصر الطفل.

اعجاب contains()أطلقت حملة text() تكون الوظيفة حساسة لحالة الأحرف بشكل افتراضي. نفس الشيء lower-case() or upper-case() يمكن استخدام الحل البديل للمطابقة غير الحساسة لحالة الأحرف.

الجمع بين محددات النص وتعبيرات XPath الأخرى

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

على سبيل المثال، يمكنك استخدام XPath التالي لتحديد <a> العناصر التي تحتوي على كلمة "click" في نص الارتباط الخاص بها، ولكن فقط إذا كانت تحتوي أيضًا على الفئة "cta-button":

//a[contains(text(), "click") and @class="cta-button"]

أو هذا التعبير لتحديد الثالث <p> عنصر في الصفحة، ولكن فقط إذا كان محتوى النص الخاص به يبدأ بـ "مقدمة":

//p[starts-with(text(), "Introduction")][3]

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

أمثلة على محدد النص مع مكتبات بايثون

دعونا نلقي نظرة على بعض الأمثلة العملية لاستخدام محددات النص XPath مع مكتبات تجريد الويب الشائعة في Python.

مثال مع lxml والطلبات

import requests
from lxml import html

# Send a GET request to the webpage
page = requests.get(‘https://example.com‘)

# Parse the HTML content
tree = html.fromstring(page.content)

# Select all <a> elements that contain the text "click me"
links = tree.xpath(‘//a[contains(text(), "click me")]‘)

# Print the href attribute of each selected link
for link in links:
    print(link.get(‘href‘))

مثال مع BeautifulSoup

import requests
from bs4 import BeautifulSoup

# Send a GET request to the webpage
page = requests.get(‘https://example.com‘)

# Parse the HTML content
soup = BeautifulSoup(page.content, ‘html.parser‘)

# Select the first <p> element that starts with the text "Introduction"
intro_para = soup.select_one(‘p[text^="Introduction"]‘)

print(intro_para.text)

مثال مع السيلينيوم

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

# Launch a browser and navigate to the webpage
driver = webdriver.Chrome()
driver.get(‘https://example.com‘)

# Select the <button> element with the exact text "Submit"
submit_button = driver.find_element(By.XPATH, ‘//button[text()="Submit"]‘)

submit_button.click()

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

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

  1. كن على دراية بالمسافات البيضاء في النص الذي تحاول مطابقته. يمكن أن تؤدي المسافات الزائدة أو أحرف السطر الجديد إلى فشل محدداتك. استخدم Normalize-space() لإزالة المسافات البيضاء البادئة واللاحقة وطي المسافات البيضاء الداخلية إذا لزم الأمر.

  2. انتبه إلى الكتابة بالأحرف الكبيرة. بشكل افتراضي، تكون مطابقة النص في XPath حساسة لحالة الأحرف. استخدم الأحرف الصغيرة () أو الأحرف الكبيرة () للمطابقة غير الحساسة لحالة الأحرف.

  3. تجنب محددات النص العامة بشكل مفرط، لأنها يمكن أن تتطابق مع العناصر غير المقصودة. حاول دمج محددات النص مع أسماء العناصر أو سماتها لجعلها أكثر تحديدًا.

  4. اختبر دائمًا محدداتك مقابل محتوى الصفحة الحقيقي والحالي. تتغير مواقع الويب بشكل متكرر، لذلك قد تفشل أدوات التحديد التي عملت بالأمس اليوم إذا تم تحديث محتوى النص.

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

وفي الختام

يوفر XPath طرقًا فعالة لتحديد العناصر بناءً على محتوى النص الخاص بها، وذلك باستخدام الخيار contains() و text() الوظائف. contains() مفيد لمطابقة العناصر التي تحتوي على سلسلة فرعية نصية محددة، بينما text() تحديد العناصر حسب محتواها النصي الكامل الدقيق.

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

أبعد فقط contains() و text()، يحتوي XPath على العديد من الوظائف المفيدة الأخرى للتعامل مع النص، مثل starts-with(), ends-with(), normalize-space()، و اكثر. استثمر بعض الوقت في تعلم هذه الأجزاء والأجزاء الرئيسية الأخرى من بناء جملة XPath.

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

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

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