Meteen naar de inhoud

Elementen selecteren op tekst in XPath

  • by
  • Blog
  • 6 min gelezen

Bij het scrapen van websites moet u vaak elementen op de pagina selecteren op basis van hun tekstinhoud. Hierdoor kunt u de gegevens die u wilt extraheren nauwkeurig targeten. XPath, een querytaal voor het selecteren van knooppunten in XML- en HTML-documenten, biedt een aantal manieren om dit te doen met behulp van de contains() en text() functies.

In deze handleiding gaan we dieper in op de manier waarop u deze tekstselectietechnieken kunt gebruiken in uw XPath-expressies. We bespreken de syntaxis, lopen door voorbeelden en bespreken enkele best practices om u te helpen effectief elementen te selecteren op basis van hun tekstinhoud bij webscrapen.

Bevat() gebruiken om elementen te selecteren die tekst bevatten

Het XPath contains() Met de functie kunt u elementen selecteren die een specifieke tekstsubtekenreeks bevatten. Er zijn twee argumenten nodig:

  1. Een knooppuntset waarin u kunt zoeken
  2. De tekstsubtekenreeks die moet overeenkomen

De syntaxis ziet er als volgt uit:

//element[contains(text(), "substring")]

Hierdoor wordt alles geselecteerd element knooppunten waarvan de tekstinhoud het opgegeven bevat substring.

Beschouw bijvoorbeeld de volgende HTML:

<ul>
  <li>Apples</li>
  <li>Oranges</li>
  <li>Pears and Grapes</li>
</ul>

Alles selecteren <li> elementen die de tekst "en" bevatten, zou je gebruiken:

//li[contains(text(), "and")]

Dit zou overeenkomen met de derde <li> element, "Peren en druiven".

De contains() functie is standaard hoofdlettergevoelig. Om een ​​hoofdletterongevoelige overeenkomst uit te voeren, kunt u de lower-case() or upper-case() functies om de behuizing te normaliseren:

//li[contains(lower-case(text()), "and")]

Een belangrijk kenmerk van contains() is dat de substringmatch zich over onderliggende elementen kan uitstrekken. In deze HTML bijvoorbeeld:

<p>
  Select <em>this</em> paragraph.
</p>

Het XPath //p[contains(text(), "Select this")] zou nog steeds overeenkomen met de <p> tag, ook al worden "Select" en "this" gescheiden door de <em> kindelement.

Text() gebruiken om elementen op exacte tekst te selecteren

Terwijl contains() is handig voor gedeeltelijke tekstovereenkomsten; soms moet u de volledige tekstinhoud exact overeenkomen. Dit is waar de text() functie komt erbij. Het selecteert elementen op basis van hun volledige tekstinhoud.

De syntaxis is:

//element[text()="exact text"]

Met deze HTML bijvoorbeeld:

<div>
  <p>Hello world!</p>
  <p>Hello again</p>
</div>

De XPath-uitdrukking //p[text()="Hello world!"] zou alleen de eerste selecteren <p> element. De seconde <p> element komt niet overeen, omdat de tekstinhoud ervan niet precies "Hallo wereld!" is.

Anders contains() text() functie komt alleen overeen met de directe tekstinhoud van een element. Het komt niet overeen met tekst binnen onderliggende elementen. Bijvoorbeeld, //div[text()="Hello world!"] komt met niets overeen in de bovenstaande HTML, omdat de <div> zelf bevat niet direct de tekst "Hallo wereld!". Die tekst staat in de <p> kindelement.

Like contains() text() functie is standaard hoofdlettergevoelig. Hetzelfde lower-case() or upper-case() Er kan een tijdelijke oplossing worden gebruikt voor hoofdletterongevoelige overeenkomsten.

Tekstkiezers combineren met andere XPath-expressies

Tekstselectors worden nog krachtiger wanneer ze worden gecombineerd met andere delen van XPath-expressies, zoals tagnamen, attributen en positionele selectors. Hierdoor kunt u zeer gerichte selectors maken, zodat u precies kunt zien welke elementen u nodig heeft.

U kunt bijvoorbeeld het volgende XPath gebruiken om te selecteren <a> elementen die het woord "klik" in hun linktekst bevatten, maar alleen als ze ook de klasse "cta-knop" hebben:

//a[contains(text(), "click") and @class="cta-button"]

Of deze uitdrukking om de derde te selecteren <p> element op de pagina, maar alleen als de tekstinhoud begint met "Inleiding":

//p[starts-with(text(), "Introduction")][3]

Door verschillende XPath-constructies te mixen en matchen, kunt u zeer specifieke selectors bouwen die vrijwel elk webscraping-scenario aankunnen.

Voorbeelden van tekstselectie met Python-bibliotheken

Laten we eens kijken naar enkele praktische voorbeelden van het gebruik van XPath-tekstselectors met algemene Python-webscraping-bibliotheken.

Voorbeeld met lxml en verzoeken

import requests
from lxml import html

# Send a GET request to the webpage
page = requests.get(‘https://example.com‘)

# Parse the HTML content
tree = html.fromstring(page.content)

# Select all <a> elements that contain the text "click me"
links = tree.xpath(‘//a[contains(text(), "click me")]‘)

# Print the href attribute of each selected link
for link in links:
    print(link.get(‘href‘))

Voorbeeld met BeautifulSoup

import requests
from bs4 import BeautifulSoup

# Send a GET request to the webpage
page = requests.get(‘https://example.com‘)

# Parse the HTML content
soup = BeautifulSoup(page.content, ‘html.parser‘)

# Select the first <p> element that starts with the text "Introduction"
intro_para = soup.select_one(‘p[text^="Introduction"]‘)

print(intro_para.text)

Voorbeeld met Selenium

from selenium import webdriver
from selenium.webdriver.common.by import By

# Launch a browser and navigate to the webpage
driver = webdriver.Chrome()
driver.get(‘https://example.com‘)

# Select the <button> element with the exact text "Submit"
submit_button = driver.find_element(By.XPATH, ‘//button[text()="Submit"]‘)

submit_button.click()

Tips en best practices

Houd rekening met deze tips wanneer u XPath-tekstkiezers voor webscrapen gebruikt:

  1. Houd rekening met witruimte in de tekst die u probeert te matchen. Extra spaties of nieuweregeltekens kunnen ervoor zorgen dat uw selectors mislukken. Gebruik normalize-space() om voor- en achterliggende witruimte te verwijderen en indien nodig de binnenste witruimte samen te vouwen.

  2. Let op hoofdlettergebruik. Standaard is tekstmatching in XPath hoofdlettergevoelig. Gebruik kleine letters() of hoofdletters() voor hoofdletterongevoelige overeenkomsten.

  3. Vermijd al te algemene tekstkiezers, omdat deze onbedoelde elementen kunnen matchen. Probeer tekstkiezers te combineren met elementnamen of attributen om ze specifieker te maken.

  4. Test uw selectors altijd aan de hand van echte, actuele pagina-inhoud. Websites veranderen regelmatig, dus selectors die gisteren goed werkten, kunnen vandaag mislukken als de tekstinhoud is bijgewerkt.

  5. Als een website inconsistente opmaak of door gebruikers gegenereerde inhoud heeft, zijn tekstkiezers mogelijk onbetrouwbaar. In deze gevallen is het vaak beter om structurele selectors te gebruiken op basis van elementnamen, attributen of positie in de documentboom.

Conclusie

XPath biedt krachtige manieren om elementen te selecteren op basis van hun tekstinhoud, met behulp van de contains() en text() functies. contains() is handig voor het matchen van elementen die een specifieke tekstsubtekenreeks bevatten, while text() selecteert elementen op basis van hun exacte, volledige tekstinhoud.

Deze tekstselectors zijn nog effectiever in combinatie met andere XPath-expressies om zeer gerichte elementselectors voor webscraping te creëren.

meer dan alleen contains() en text(), XPath heeft verschillende andere handige functies voor het werken met tekst, zoals starts-with(), ends-with(), normalize-space(), en meer. Investeer wat tijd in het leren van deze en andere belangrijke onderdelen van de XPath-syntaxis.

Met een goed begrip van de XPath-tekstkiezers bent u goed op weg om de gegevens die u nodig hebt nauwkeurig te targeten en uit webpagina's te extraheren. Veel plezier met schrapen!

Doe mee aan het gesprek

Uw e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd *