XPath-tester

Plak XML of HTML met maximaal 1.000.000 tekens. De evaluatie gebeurt in deze browser met XPath 1.0.

Een absolute of relatieve XPath 1.0-expressie. Prefixen die in het document zijn gedeclareerd, worden automatisch geregistreerd; een standaardnamespace is beschikbaar onder het prefix d.

XPath schrijven voor scraping of XSLT is gokken en bijstellen zonder live proefomgeving. Deze tester neemt je XML of HTML in het ene vak en je expressie in het andere, evalueert XPath 1.0 met de engine van je eigen browser en toont elke gevonden node met soort, attributen, tekstinhoud en geserialiseerde markup. Scalaire expressies zoals count(//book) geven hun waarde direct terug, en namespace-prefixen die in het document zijn gedeclareerd worden automatisch voor je geregistreerd. Alles draait in je browser: het document wordt nooit geüpload.

Zo test je een XPath-expressie

  1. 1

    Plak XML of HTML

    De automatische detectie schakelt over op soepel HTML-parsen zodra ze een HTML-doctype of -root ziet; je kunt de XML- of HTML-modus ook afdwingen.

  2. 2

    Voer je XPath in

    Absoluut (`/library/book`) of relatief (`//div[@class='card']`), elke XPath 1.0-expressie.

  3. 3

    Evalueer

    De XPath-engine van je browser voert de query lokaal uit; er wordt niets naar een server gestuurd.

  4. 4

    Bekijk de resultaten

    Elke match toont de soort node, de attributen, de ingekorte tekst en de geserialiseerde markup; er worden maximaal 200 matches getoond.

De basis van XPath 1.0

Expressie Wat het selecteert
/books/book <book>-kinderen van de root <books>
//book Elke <book> waar dan ook in het document
//book[@id='42'] <book> met id-attribuut gelijk aan 42
//book[1] Eerste <book> per ouder (niet van het document)
(//book)[1] Eerste <book> in het hele document
//book[title='1984'] <book> waarvan de <title>-tekst “1984” is
//book/@id id-attributen van alle <book>-elementen
//book[position() > 1] Alle <book> behalve de eerste
//book[last()] Laatste <book> per ouder

Scalaire expressies werken ook: count(//book) geeft een getal terug, string(//title) een tekenreeks en boolean(//book[@id]) waar of onwaar. De tester toont die waarden direct in plaats van een lijst met nodes.

Veelgebruikte assen naast child

  • ancestor::, alle voorouders
  • following-sibling::, broers en zussen na de huidige node
  • preceding-sibling::, broers en zussen ervoor
  • descendant::, alle nakomelingen
  • attribute:: (afkorting @), attributen van de huidige node
  • parent:: (afkorting ..), het ouderelement

Eigenaardigheden van HTML

HTML is geen strikte XML, dus de tester parst het soepel met de HTML-parser van je browser in plaats van de strikte XML-parser. De HTML-modus wordt automatisch gedetecteerd via <!DOCTYPE html> of een <html>-root, en met de keuze voor de documentmodus kun je elk van beide modi afdwingen. In HTML-modus worden tag- en attribuutnamen in kleine letters gezet, schrijf je XPath dus in kleine letters: //div[@class], niet //DIV[@CLASS].

Namespaces

XML met namespaces vereist geregistreerde prefixen:

<rss xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <item>
    <content:encoded>...</content:encoded>
  </item>
</rss>

De tester doorzoekt het document op xmlns-declaraties en registreert elk prefix automatisch, dus //content:encoded werkt meteen. Een standaardnamespace (een kale xmlns="...") heeft geen prefix in het document, dus de tester koppelt die aan het prefix d: selecteer <item>-elementen in een feed met standaardnamespace via //d:item. De geregistreerde namespaces staan naast de resultaten.

Wat deze tester niet evalueert

Browsers evalueren XPath 1.0, hetzelfde dialect dat de meeste scraping-stacks gebruiken. Functies uit XPath 2.0 en later, zoals matches(string, regex), tokenize(string, delimiter), for ... return-expressies en sequentie-operatoren, horen daar niet bij; je vindt ze in XSLT 2.0/3.0-toolchains. XPath 1.0 blijft de meest portabele keuze voor webscraping.

Testtips

  • Begin breed en versmal. Eerst //div, dan //div[@class], dan de specifieke class-waarde.
  • Controleer de namespace-declaraties. De meeste “waarom geeft mijn XPath niets terug?”-bugs zijn namespaces; kijk in de lijst met geregistreerde namespaces.
  • Let op hoofdletters. XML is hoofdlettergevoelig. De HTML-modus zet namen in kleine letters.
  • Test string() bij het uitpakken van tekst. //p/text() en string(//p) verschillen zodra er geneste markup is.

Veelgestelde vragen

Nee, alleen XPath. De meeste browsers ondersteunen beide via document.querySelectorAll (CSS) en document.evaluate (XPath). Gebruik wat voor de taak het duidelijkst is.

Bij het parsen van HTML worden tag- en attribuutnamen in kleine letters gezet. Zorg dat je XPath kleine letters gebruikt: //div[@class], niet //DIV[@CLASS]. Controleer ook de modus: XML afdwingen op slordige HTML mislukt met een parsefout, terwijl de HTML-modus het soepel parst.

Prefixen die in het document zijn gedeclareerd worden automatisch geregistreerd voor je expressie. Een standaardnamespace wordt gekoppeld aan het prefix d, dus //d:item selecteert <item>-elementen in een document met standaardnamespace. De actieve koppelingen staan bij de resultaten.

Nee. Het document en de expressie worden geëvalueerd door de XPath-engine van je eigen browser en worden niet naar onze server gestuurd, niet opgeslagen en niet aan het paginaadres toegevoegd; ze bestaan alleen in deze browsersessie zodat de weergave met meerdere stappen je resultaten kan tonen.

Gerelateerde tools