donker proxyscrape logo

De juiste selector kiezen voor web scrapen: CSS of XPath

Schrapen, De verschillen, 01 feb-20225 min gelezen

Weet jij wat de juiste selector is om te gebruiken bij web scraping? Web scraping is de laatste tien jaar erg populair geworden om gegevens van het internet te halen. Het helpt bedrijven gegevens te verzamelen en te analyseren om betere zakelijke beslissingen te nemen. Dankzij geautomatiseerde technologieën is web scraping nog nooit zo eenvoudig geweest als nu.

Ongeacht de tool of het framework dat je kiest, moet je echter een cruciale beslissing nemen om ervoor te zorgen dat je scraper de gegevens netjes schraapt. Dat is of je webelementen wilt extraheren met XPath of CSS selectors, wat je in dit artikel zult leren.

Laten we er eens induiken met een paar bestaande voorbeelden.

Wat is een XPath selector?

XPath staat voor XML Path Language. Het gebruikt echter een niet-XML syntaxis om tags of groepen tags uit een XML-document of HTML te selecteren, zoals bij web scraping. Met XPath kun je expressies schrijven om direct toegang te krijgen tot een HTML- of XML-element zonder de hele HTML-boom te doorlopen. 

Om te begrijpen hoe je een element kunt benaderen met XPath, gaan we dieper in op een HTML-code. Ik ga ervan uit dat je de basis van HTML al kent.

<!doctype html>
<html xmlns=”http://www.w3.org/1999/xhtml” lang="en" xml:lang="en">
<head>
    <meta charset="utf-8">
    <title>Awesome Products at your Fingertips</title>
</head>

<body>
    <h1>Description of product features</h1>
    <p>These products are great. So let's just look at the features !</p>
    <ul id="product-list" class=”basic-list”>
	   <li>Item 1</li>
	   <li>Item 2</li>
	   <li>Item 3</li>
	</ul>
</body>
</html>

Je kunt de bovenstaande code in een editor naar keuze typen en opslaan als products.html. Vervolgens kun je het bekijken in een browser (bij voorkeur Google Chrome, omdat we daar dit voorbeeld mee zullen doorlopen).

Wanneer de browser deze code uitvoert, wordt de HTML gefraseerd en wordt er een boomstructuur van de elementen gemaakt. Dit staat bekend als het DOM (Document Object Model) in de volgende vorm:

Je kunt meer lezen over het DOM op de gegeven link. Nu richten we ons hier op het XPath over hoe je meteen naar elk van deze elementen kunt navigeren zonder de hele boom te doorlopen. Laten we dus beginnen met de basisterminologie van het Xpath.

Wat zijn knooppunten?

Met XPath is het meest fundamentele element een knooppunt. Knooppunten zijn gewoon de individuele elementen die je net zag in de DOM-boom. Naarmate we verder gaan in dit artikel, zul je nog ontdekken dat knooppunten bestaan uit tag-elementen, attributen, strings die er waarden aan toekennen, enzovoort. Er zijn er zeven in elke XML- of HTML-pagina en laten we elk type knooppunt eens nader bekijken.

  • Element node – These are the major tags in an HTML document. For instance, in our example, the elements nodes are <title>,<meta>,<body>,<h1>,<p>,<ul>,and <li>.

  • Attribute node – You can provide elements nodes with properties to give them unique names or apply CSS styles. In this example, we have provided the <ul> element with attributes “id” and “class”. More on ids and classes later.

  • Atomic values – these are the values that are inside the node elements. Over here, the atomic values are the text inside the <title>, <h1>,<p> and each of the three <li> elements.

Hoewel de bovenstaande drie de belangrijkste zijn, is het voor de informatie ook belangrijk om de volgende vier te kennen.

  • Namespace: Since XPath also deals with XML documents, it is a standard that specifies how you can use elements and attributes. It is identified by URI (Uniform Resource Identifier). For the latest HTML 5 version, you can set the namespace like this: <html xmlns=”http://www.w3.org/1999/xhtml”  lang=”en” xml:lang=”en”>.

  • Commentaar: Dit is het commentaargedeelte van een HTML- of XML-document dat de compiler of een parser niet verwerkt.

  • Process instruction: As with the case of HTML documents, they are the nodes that link external files such as CSS and JavaScript files. For example, the<link> node to include CSS files and the <src> node to include JavaScript files.

  • Root node: As you guessed it right, this is the topmost element of an HTML document: the <html> node.

Wat is de relatie tussen knooppunten?

  • Parent: These are the root elements of the DOM tree that are precisely one level up. Each element has exactly one parent. According to our example, the parent of <li> element is <ul>.
  • Children: Children nodes are exactly one level down in the DOM tree. As per our example <h1>,<p> and <ul> elements are children of the <body> element.
  • Siblings: These are the elements that share the same parent. In our example, both the <li> elements are siblings of the <ul> parent. Also <h1>,<p> and <ul> are siblngs as they belong to the same parent <body>.
  • Descendants: Any elements that are one level down are descendants. For instance, the <title> element is a descendant of the <head> element.
  • Ancestor: Any element level up in the DOM tree is called an ancestor. In our example <li> element’s ancestors are <ul>,<body> and <html>.

Hoe het XPath van een HTML-element vinden?

Er zijn twee manieren om dit te doen. Ten eerste, laten we het demonstreren of een voorbeeld coderen. Zoals ik hierboven al zei, hoop ik dat je het op je lokale schijf hebt opgeslagen en klaar bent om het in je browser te bekijken.

Beweeg de muis over item 1 wanneer de pagina wordt geladen en klik er met de rechtermuisknop op. Selecteer vervolgens Inspecteren uit de menu-items die verschijnen, zoals weergegeven in de onderstaande schermafbeelding:

Then you would be able to find the full XPath by clicking on the <li> element in the console and selecting “copy” from the drop-down menu, and then specifying “Copy full XPath as shown below:

Nadat je het in een tekstbestand of ergens anders hebt geplakt, zou je het volgende krijgen:

/html/body/ul/li[1]

Dit staat bekend als het absolute pad. Ik zal hieronder uitleggen hoe je het hebt afgeleid.

Stap 1 => li[1] /Hier staat één voor het eerste li element

Stap 2 => /li[1]

Stap 3 => ul/li[1]

Stap 4 => /ul/li[1]
 
Stap 5 => body/ul/li[1]

Stap 6 => /body/ul/li[1]

Stap 7 => html/body/ul/li[1]

Stap 8 => /html/body/ul/li[1]

Absoluut pad

With this method, you need to work your way backward, starting from the target element all the way back to the root element. You add a forward slash before the element you have just added as you write each element. So let’s look at how you could work out the XPath for the first <li> element manually:

Hoewel de bovenstaande methode lang lijkt, zal het je helpen begrijpen hoe je het volledige XPath opbouwt. Nu over naar de relatieve methode.

Relatief pad

//*[@id="product-list"]/li[1]

As you can see, it is pretty short, and the path is relative to the parent <ul> element. Since the <li> element does not have an id attribute, its relative path is relative to the <ul> element.  

Het verschil tussen relatieve en absolute paden

De significante verschillen zijn dat volledig XPath niet leesbaar en moeilijk te onderhouden is. De andere voor de hand liggende zorg is dat als er wijzigingen zijn aan een element vanaf het root element, het absolute XPath niet geldig zal zijn. Het is dus zinvol om het relatieve XPath te gebruiken.

Maar laten we, voordat we daar verder op ingaan, eerst de voor- en nadelen bekijken.

Voor- en nadelen van XPATH

Voordelen

Met XPath hoef je je geen zorgen te maken als je de naam van een element niet weet, omdat je de functie contains kunt gebruiken om te zoeken naar waarschijnlijke overeenkomsten. Daarom kun je hoger in de DOM zoeken naar items om te scrapen.

Een ander belangrijk voordeel van CSS is dat het werkt in oudere legacy browsers, zoals verouderde versies van Internet Explorer.

Nadelen

Zoals je hierboven hebt geleerd, is het belangrijkste nadeel dat het gemakkelijker te breken is wanneer je de elementen in het pad wijzigt. Het kan moeilijk te begrijpen zijn in vergelijking met de CSS selectors die je hieronder zult ontdekken.

Bij het ophalen van elementen uit het XPath is de prestatie ook veel langzamer dan die van CSS.

Wat is een CSS-selector?

Zoals je al weet, staat CSS voor Cascading Style Sheets die prominent worden gebruikt bij het stylen van HTML-elementen op een webpagina. Deze stijlen omvatten het toepassen van kleuren op je lettertype, achtergrondafbeeldingen en kleuren, het uitlijnen en positioneren van elementen en het vergroten/verkleinen van spaties tussen alinea's.

Om een stijl in te stellen op een HTML-element, moet je die specificeren via een CSS Selector. Laten we beginnen met een eenvoudig voorbeeld met de opmaak in de volgende sectie.

Hoe worden CSS-selectors gemaakt?

<h1 id="main-heading" class="header-styles" name="h1name">What are CSS Selectors?</h1>

Dus hier is de CSS selector voor het bovenstaande element: 

  • <h1>-selects by the element name <h1>
  • #main-heading - #bepaalt het id van het element
  • .header-styles - De punt geeft de klassenaam aan
  • [name="h1name"] - U kunt de attributen tussen vierkante haken opgeven.

Je kunt ze ook combineren:

h1.header-styles-DezeCSS-selector selecteert h1-elementen met klasse header-styles.

Geavanceerde selecteurs

De operator > wordt gebruikt om kinderen te selecteren. De operator + daarentegen kiest de eerste broer of zus en de operator ~ wordt gebruikt om alle broers of zussen te selecteren. Enkele voorbeelden:

  • ul#product-list > li – selects <li> elements which are children of <ul> with id of product-list.
  • ul#product-list li – selects <li> elements which are descendent of <ul> with id of product-list.
  • ul#product-list + li – selects first <li> element after <ul> with id of product-list.
  • ul#product-list ~ li – Selects all <li> elements after the <ul> with id of product-list. 

Voordelen en nadelen van het gebruik van CSS-selectors

Voordelen

In tegenstelling tot XPath, dat de Beautiful Soup niet ondersteunt, worden CSS selectors ondersteund door de meest effectieve scraping bibliotheken. In tegenstelling tot XPath zijn CSS-selectors ook eenvoudiger te leren en te onderhouden. Bijna alle browsers ondersteunen het, behalve oudere browsers onder Internet Explorer versie 8. Deze browsers worden tegenwoordig echter zelden gebruikt.

Nadelen

Zelfs als je de oudere versies van Internet Explorer buiten beschouwing laat, kunnen er nog steeds inconsistenties zijn in hoe ze worden weergegeven op verschillende browsers.

Omdat er verschillende CSS-versies zijn, kunnen deze verwarring veroorzaken bij zowel ontwikkelaars als beginners.

Een andere essentiële factor in de huidige webtechnologie is de beveiliging van CSS.  

Wat zijn de verschillen tussen CSS Selectors en XPath?

Het duidelijke verschil tussen XPath en CSS is dat XPath bidirectioneel is. Dit betekent dat je in beide richtingen in de DOM-boom kunt navigeren. Met CSS kun je echter alleen van de parent node naar child nodes gaan, wat bekend staat als eenrichtingsverkeer.

Zoals besproken in de vorige secties, is XPath moeilijker te onderhouden en geen goede kandidaat voor effectieve leesbaarheid. Aan de andere kant, hoewel XPath kan werken in oudere browsers, verschilt de manier waarop het wordt weergegeven van browser tot browser.

Daarom heeft de CSS in dat opzicht een streepje voor.

Wat moet je kiezen tussen de twee?

XPATH valt op omdat CSS alleen van de ouders naar het kind kon gaan in specifieke gebieden zoals het omhoog gaan in de DOM-boom. Wat betreft snelheid heeft CSS een streepje voor.

Het snelheidsverschil tussen XPath en CSS telt echter niet veel als het op web scraping aankomt. Er zijn andere factoren om rekening mee te houden, zoals netwerklatentie bij web scraping.

CSS zou je eerste keuze zijn als het gaat om Beautiful Soup, omdat het XPath niet ondersteunt.

Conclusie

Er is geen precies antwoord op de vraag welke selectors je moet gebruiken voor je web scraping-project. Zoals je in dit artikel hebt ontdekt, heeft XPath in bepaalde situaties een streepje voor, terwijl CSS er in andere situaties uitspringt. 

Daarom moet je rekening houden met specifieke vitale punten zoals traverseren, browserondersteuning en enkele van de technische mogelijkheden die we hebben besproken. We hopen dat je in de praktijk zult brengen wat je hebt geleerd en dat je op de hoogte blijft van meer artikelen.