XPath handleiding

In deze zelfstudie krijgt u een voorzichtige inleiding tot XPath <https://en.wikipedia.org/wiki/XPath> _, een querytaal die kan worden gebruikt om willekeurige delen van `HTML <https://en.wikipedia.org/wiki/HTML>`_documenten in Calibre. XPath is een veel gebruikte standaard, en googelen levert een hoop informatie op. Deze zelfstudie richt zich echter op het gebruik van XPath voor aan e-boeken gerelateerde taken, zoals het vinden van hoofdstukken in een ongestructureerd HTML-document.

Selecteren op naam van label

De eenvoudigste vorm van selectie is om labels op naam te selecteren. Bijvoorbeeld, stel dat u wilt alle <h2>-labels in een document wilt selecteren. De XPath query voor dit is:

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

Het voorvoegsel // betekent zoeken op elk niveau van het document. Stel nu dat u wilt zoeken naar <span> -labels die zich binnen de ``<a>``labels bevinden. Dat kan worden bereikt met:

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

Als u naar labels wilt zoeken in een bepaald gebied van het document, verander dan de prefix:

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

Dit komt overeen met <p>een zeer kort e-book om het gebruik van XPath.</p> in de voorbeeld_ebook aan te tonen, maar niet een van de andere <p>-labels. Het h: voorvoegsel in de bovenstaande voorbeelden is nodig om overeen te komen met XHTML-labels. Dit komt omdat intern, Calibre alle inhoud als XHTML vertegenwoordigt. In XHTML-labels hebben een naamruimte, en h: is de naamruimte prefix voor HTML-labels.

Stel nu dat u zowel de tags ``<h1> ‘’ als ``<h2> ‘’ wilt selecteren. Om dat te doen, hebben we een XPath-constructie nodig genaamd * predicaat *. Een :dfn: predicaat is gewoon een test die wordt gebruikt om tags te selecteren. Tests kunnen willekeurig krachtig zijn en naarmate deze zelfstudie vordert, zult u krachtigere voorbeelden zien. Een predicaat wordt gemaakt door de testuitdrukking tussen vierkante haken te plaatsen:

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

Er zijn verschillende nieuwe functies in deze XPath-expressie. De eerste is het gebruik van het jokerteken `` * ``. Het betekent * komt overeen met elke tag *. Kijk nu naar de testuitdrukking `` name ()=’h1’ of name ()=’h2’ ‘’. : term: name() is een voorbeeld van een * ingebouwde functie *. Het evalueert eenvoudigweg de naam van de tag. Dus door het te gebruiken, kunnen we tags selecteren waarvan de namen h1 of` h2` zijn. Merk op dat de functie name () naamruimten negeert, zodat het voorvoegsel `` h: `` niet nodig is. XPath heeft verschillende handige ingebouwde functies. Een paar meer zullen in deze zelfstudie worden geïntroduceerd.

Selecteren op eigenschap

Om tags te selecteren op basis van hun attributen, is het gebruik van predicaten vereist:

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

Hier verwijst de operator ``@’’ naar de kenmerken van de tag. U kunt enkele van de in ‘XPath ingebouwde functies’ _ gebruiken om meer geavanceerdere vergelijkingen uit te voeren op kenmerkwaarden.

Selecteren op label inhoud

Met XPath kunt u zelfs tags selecteren op basis van de tekst die ze bevatten. De beste manier om dit te doen is om de kracht van * reguliere expressies * te gebruiken via de ingebouwde functie re:test():

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

Hier verwijst de operator . naar de inhoud van de tag, net zoals de operator ``@’’ verwijst naar de kenmerken.

Voorbeeld e-boek

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

naam()

De naam van het huidige label.

bevat()

contains(s1, s2) returns true if s1 contains s2.

re:test()

re:test (src, patroon, vlaggen) geeft waar terug als de string src overeenkomt met de reguliere expressie patroon. Een bijzonder handige vlag is i, het maakt vergelijken hoofdletter ongevoelig. Een goede inleiding over de syntaxis voor reguliere expressies is te vinden op regexp syntax <https://docs.python.org/library/re.html> _