Tutoriel XPath

Dans ce tutoriel, il vous sera donné une légère introduction à XPath, un langage de requête qui peut être utilisé pour sélectionner des parties quelconques de documents HTML dans calibre. XPath est un standard utilisé largement, et faire une recherche sur Google produira une tonne d’information. Ce tutoriel, toutefois, se concentrera sur l’utilisation d’XPath pour des tâches relatives aux livres numériques comme trouver les entêtes de chapitre dans un document HTML non structuré.

Sélection par nom de balise

La forme la plus simple de sélection est de sélectionner les balises par nom. Par exemple, supposons que vous voulez sélectionner toutes les balises <h2> dans un document. La requête XPath pour cela est simplement

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

Le préfixe //`signifie *rechercher à n’importe quel niveau du document*. Maintenant supposons que vous voulez rechercher les balises ``<span>` qui sont contenues dans des balises <a>. Ceci peut être accompli avec

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

Si vous voulez rechercher des balises à un niveau particulier dans le document, changez le préfixe

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

Ceci correspondra uniquement à <p>Un livre numérique très court pour démontrer l'utilisation d'XPath.</p> dans le Exemple de livre numérique mais dans aucune des autres balises <p>. Le préfixe h: dans l’exemple plus haut est nécessaire pour correspondre aux balises XHTML. Ceci car, en interne, calibre représente tout le contenu comme du XHTML. En XHTML les balises ont un espace de nom, et h: est le préfixe d’espace de nom pour les balises HTML.

Maintenant supposons que vous voulez sélectionner conjointement les balises <h1> et <h2>. Pour faire cela, nous avons besoin d’une construction XPath appelée prédicat. Un prédicat est simplement un test qui est utilisé pour sélectionner les balises. Les tests peuvent être arbitrairement puissants et au long de la progression de ce tutoriel, vous verrez des exemples plus puissants. Un prédicat est créé en mettant l’expression test entre crochets.

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

Il y a plusieurs nouvelles caractéristiques dans cette expression XPath. La première est l’utilisation du joker *. Il signifie correspond à n’importe quelle balise. Maintenant regardez l’expression test name()='h1' or name()='h2'. name() est un exemple d’une fonction intégrée. Il évalue simplement le nom de la balise. Donc en l’utilisant, nous pouvons sélectionner des balises dont les noms sont soit h1 ou h2. Notez que la fonction name() ignore les espaces de nom de sorte qu’il n’est d’aucune nécessité du préfixe h:. XPath a plusieurs fonctions intégrées utiles. Quelques unes de plus seront introduites dans ce tutoriel.

Sélection par attributs

Pour sélectionner des balises sur base de leurs attributs, l’utilisation des prédicats est requise //

//*[@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")

Ici l’opérateur @ réfère aux attributs de la balise. Vous pouvez utiliser certaines des Fonctions intégrées XPath pour effectuer des correspondances plus sophistiquées sur les valeurs attribut.

Sélection par contenu de balise

En utilisant XPath, vous pouvez même sélectionner des balises basées sur le texte qu’elles contiennent. La meilleure manière de faire cela est d’utiliser la puissance des expressions régulières par l’intermédiaire de la fonction intégrée re:test():

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

Ici l’opérateur . réfère au contenu de la balise, tout comme l’opérateur @ réfère à ses attributs.

Exemple de livre numérique

<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>

Les fonctions XPath intégrées

name()

Le nom de la balise actuelle.

contains()

contains(s1, s2) renvoie true si s1 contient s2.

re:test()

re:test(src, pattern, flags) renvoie true si la chaîne src correspond au pattern de l’expression régulière. un indicateur particulièrement utile est i, il rend les correspondances sensibles à la casse. Une bonne amorce sur la syntaxe pour les expressions régulières peut être trouvée sur regexp syntax