دليل 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.

Now suppose you want to select both <h1> and <h2> tags. To do that, we need an XPath construct called predicate. A predicate is simply a test that is used to select tags. Tests can be arbitrarily powerful and as this tutorial progresses, you will see more powerful examples. A predicate is created by enclosing the test expression in square brackets:

//*[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