دليل XPath التعليمي

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

التحديد باسم الوسم

أبسط أشكال التحديد هو تحديد الوسوم بالاسم. على سبيل المثال، لنفترض أنك تريد تحديد جميع وسوم <h2> في مستند. استعلام XPath لذلك هو ببساطة:

//h:h2        (Selects all <h2> tags)

البادئة // تعني البحث في أي مستوى من المستند. الآن لنفترض أنك تريد البحث عن وسوم <span> الموجودة داخل وسوم <a>. يمكن تحقيق ذلك باستخدام:

//h:a/h:span    (Selects <span> tags inside <a> tags)

إذا كنت تريد البحث عن وسوم في مستوى معين في المستند، فغير البادئة:

/h:body/h:div/h:p (Selects <p> tags that are children of <div> tags that are
             children of the <body> tag)

سيطابق هذا فقط <p>كتاب إلكتروني قصير جدًا يوضح استخدام XPath.</p> في كتاب إلكتروني نموذجي ولكن ليس أي من وسوم <p> الأخرى. البادئة h: في الأمثلة أعلاه ضرورية لمطابقة وسوم XHTML. وذلك لأن calibre يمثل جميع المحتوى داخليًا كـ XHTML. في XHTML، تحتوي الوسوم على مساحة اسم، و h: هي بادئة مساحة الاسم لوسوم HTML.

الآن لنفترض أنك تريد تحديد كل من وسوم <h1> و <h2>. للقيام بذلك، نحتاج إلى بناء XPath يسمى المسند. المسند هو ببساطة اختبار يستخدم لتحديد الوسوم. يمكن أن تكون الاختبارات قوية بشكل تعسفي ومع تقدم هذا الدليل التعليمي، سترى أمثلة أكثر قوة. يتم إنشاء المسند بإحاطة تعبير الاختبار بأقواس مربعة:

//*[name()='h1' or name()='h2']

هناك العديد من الميزات الجديدة في تعبير XPath هذا. الأول هو استخدام الرمز البديل *. يعني مطابقة أي وسم. الآن انظر إلى تعبير الاختبار name()='h1' or name()='h2'. name() هو مثال على دالة مدمجة. إنها ببساطة تقيّم إلى اسم الوسم. لذا باستخدامها، يمكننا تحديد الوسوم التي تكون أسماؤها إما h1 أو h2. لاحظ أن دالة name() تتجاهل مساحات الأسماء بحيث لا توجد حاجة لـ البادئة h:. يحتوي XPath على العديد من الدوال المدمجة المفيدة. سيتم تقديم المزيد في هذا الدليل التعليمي.

التحديد حسب السمات

لتحديد الوسوم بناءً على سماتها، يلزم استخدام المسندات:

//*[@style]              (Select all tags that have a style attribute)
//*[@class="chapter"]    (Select all tags that have class="chapter")
//h:h1[@class="bookTitle"] (Select all h1 tags that have class="bookTitle")

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

التحديد حسب محتوى الوسم

باستخدام XPath، يمكنك حتى تحديد الوسوم بناءً على النص الذي تحتويه. أفضل طريقة للقيام بذلك هي استخدام قوة التعبيرات العادية عبر الدالة المدمجة re:test():

//h:h2[re:test(., 'chapter|section', 'i')] (Selects <h2> tags that contain the words chapter or
                                          section)

هنا يشير عامل التشغيل . إلى محتويات الوسم، تمامًا كما أشار عامل التشغيل ``@``إلى سماته.

كتاب إلكتروني نموذجي

<html>
    <head>
        <title>A very short e-book</title>
        <meta name="charset" value="utf-8" />
    </head>
    <body>
        <h1 class="bookTitle">A very short e-book</h1>
        <p style="text-align:right">Written by Kovid Goyal</p>
        <div class="introduction">
            <p>A very short e-book to demonstrate the use of XPath.</p>
        </div>

        <h2 class="chapter">Chapter One</h2>
        <p>This is a truly fascinating chapter.</p>

        <h2 class="chapter">Chapter Two</h2>
        <p>A worthy continuation of a fine tradition.</p>
    </body>
</html>

وظائف XPath المدمجة

name()

اسم الوسم الحالي.

contains()

contains(s1, s2) تعيد true إذا كانت s1 تحتوي على s2.

re:test()

re:test(src, pattern, flags) تعيد true إذا كانت السلسلة src تطابق التعبير النمطي pattern. علامة مفيدة بشكل خاص هي i، فهي تجعل المطابقة غير حساسة لحالة الأحرف. يمكن العثور على دليل جيد حول بناء جملة التعبيرات العادية في بناء جملة regexp