Meteen naar de inhoud

Elementen per klasse selecteren in XPath: de ultieme gids

  • by
  • Blog
  • 8 min gelezen

Als u gegevens uit websites wilt extraheren, is de kans groot dat u specifieke elementen moet selecteren op basis van hun klassen. Klassen zijn een fundamentele manier om elementen in HTML te categoriseren en op te maken. Gelukkig biedt XPath krachtige manieren om elementen te selecteren op basis van hun klasse-attribuut.

In deze uitgebreide handleiding leggen we precies uit hoe u elementen per klasse kunt selecteren met behulp van XPath. Of u nu een beginner of een ervaren webschraper bent, aan het einde van dit artikel navigeert u vakkundig door HTML-documenten en kunt u zich precies richten op de elementen die u nodig hebt. Laten we beginnen!

Een korte samenvatting van XPath

Voordat we ingaan op klassenkiezers, laten we kort bekijken wat XPath is en hoe het werkt. XPath is een querytaal die wordt gebruikt om te navigeren en knooppunten in een XML- of HTML-document te selecteren. Hiermee kunt u expressies schrijven die specifieke elementen lokaliseren op basis van hun tagnaam, attributen, positie en meer.

Hier zijn enkele belangrijke dingen die u moet weten over XPath:

  • XPath behandelt het document als een boomstructuur, met een hoofdknooppunt en onderliggende knooppunten die zich ervan aftakken
  • Uitdrukkingen worden van links naar rechts geëvalueerd
  • Slashes (/) worden gebruikt om tussen knooppunten te navigeren
  • Elementen kunnen worden geselecteerd op basis van hun naam (bijv //div selecteert alles <div> elementen)
  • Predikaten tussen vierkante haakjes maken een nauwkeurigere selectie mogelijk (bijv //div[@id=‘main‘] selecteert <div> elementen met de id "main")

Nu we dat fundament hebben gelegd, gaan we onze aandacht richten op klassen en hoe we deze kunnen gebruiken in XPath-expressies.

HTML-klassen begrijpen

Klassen zijn een HTML-attribuut waarmee u een of meer klassennamen aan elementen kunt toewijzen. Ze worden voornamelijk gebruikt voor stylingdoeleinden met CSS, maar zijn ook erg handig om specifieke elementen te targeten bij webscraping.

Hier is een voorbeeld van een paragraafelement met twee klassen:

<p class="highlight text-center">This is some text.</p>

In dit geval, de <p> Op element zijn twee klassen toegepast: "highlight" en "text-center". Een element kan een willekeurig aantal klassen hebben, die worden gescheiden door spaties in de klasse-attribuutwaarde.

Eén ding om in gedachten te houden is dat klassenamen hoofdlettergevoelig zijn. Dus class="highlight" en class="Highlight" zouden als twee verschillende klassen worden beschouwd.

Nu we begrijpen wat HTML-klassen zijn, gaan we kijken hoe we met XPath elementen kunnen selecteren op basis van hun klassen.

Elementen per klasse selecteren in XPath

XPath biedt twee manieren om elementen te selecteren op basis van hun klasse-attribuut:

  1. De functie bevat() gebruiken
  2. Exacte overeenkomende klassenaam

Laten we elk van deze benaderingen nader onderzoeken.

Benadering 1: de functie bevat() gebruiken

De contains() Met de functie kunt u elementen selecteren waarvan het class-attribuut bevat een specifieke klassenaam. Hier is de basissyntaxis:

//element[contains(@class,‘classname‘)]

Om bijvoorbeeld alles te selecteren <div> elementen die de klasse "container" hebben, zou je gebruiken:

//div[contains(@class,‘container‘)]  

De contains() functie heeft een paar belangrijke kenmerken:

  • Het is hoofdlettergevoelig (dus "container" en "Container" worden als verschillend behandeld)
  • De klassenaam kan overal in de klasseattribuutwaarde voorkomen
  • Op het element kunnen ook andere klassen worden toegepast, zolang het de opgegeven klasse bevat

So contains(@class,‘container‘) zou overeenkomen met elementen als:

<div class="container"></div>
<div class="wrapper container card"></div>
<div class="container highlighted"></div>

Maar dat zou het wel niet spel:

<div class="containery"></div>
<div class="wrapper"></div>

De contains() aanpak is veelzijdig en kan een goede keuze zijn als je elementen wilt matchen die een bepaalde klasse hebben als onderdeel van een reeks van klassen. Maar als u preciezer wilt zijn, kan de volgende aanpak de voorkeur verdienen.

Benadering 2: Exacte afstemming van klassenamen

Om elementen te selecteren die een klasse-attribuut hebben dat precies overeenkomt met een specifieke waarde, kunt u deze syntaxis gebruiken:

//element[@class=‘classname‘]

Om te selecteren bijvoorbeeld <p> elementen waarbij de klasse precies "highlight" is, zou je gebruiken:

//p[@class=‘highlight‘]

Deze uitdrukking komt overeen met:

<p class="highlight"></p>  

Maar niet:

<p class="highlight text-center"></p>
<p class="highlights"></p>
<p class="Highlight"></p>

Zoals u kunt zien, is de exacte matchbenadering strenger. Het class attribuut moet bevatten Slechts de opgegeven klassenaam om te matchen. Er mogen geen andere klassen aanwezig zijn en de behuizing moet exact overeenkomen.

Deze aanpak is handig als u zeer nauwkeurig moet zijn bij het selecteren van elementen en wilt voorkomen dat elementen per ongeluk overeenkomen die de klasse bevatten als onderdeel van een grotere set.

XPath en klassen – Belangrijke overwegingen

Wanneer u XPath gebruikt om elementen per klasse te selecteren, zijn er een paar belangrijke dingen waarmee u rekening moet houden:

  • Klassenamen zijn hoofdlettergevoelig. Zoals eerder vermeld, worden "highlight" en "Highlight" behandeld als afzonderlijke klassenamen. Zorg ervoor dat uw XPath-expressies exact overeenkomen met het hoofdlettergebruik.

  • Elementen kunnen meerdere klassen hebben. Het is heel gebruikelijk dat op elementen meer dan één klasse wordt toegepast, gescheiden door spaties. De contains() aanpak zal overeenkomen met elementen zolang ze de opgegeven klasse bevatten ergens in hun klassenattribuut.

  • Exacte matching is nauwkeuriger, maar minder flexibel. Als u gebruik maken van [@class=‘classname‘], moet het class-attribuut Slechts die klasse bevatten. Als er andere klassen worden toegepast, wordt het element niet gematcht. In tegenstelling tot, contains(@class,‘classname‘) komt overeen zolang de klasse ergens in de attribuutwaarde voorkomt.

  • XPath wordt ondersteund door de meeste webscrapingtools en -bibliotheken. Of u nu Python gebruikt met BeautifulSoup of Scrapy, JavaScript met Puppeteer of Cheerio, of een andere taal/framework, u zult waarschijnlijk XPath-expressies kunnen gebruiken om gegevens te extraheren. De syntaxis voor klassenselectie blijft hetzelfde.

  • Prestaties zijn belangrijk bij grootschalig schrapen. Hoewel XPath erg krachtig is, kan het ook langzamer zijn dan andere methoden zoals CSS-selectors, vooral voor complexere expressies. Als u een groot aantal pagina's verzamelt, is het de moeite waard om verschillende benaderingen te vergelijken om te zien welke de beste prestaties oplevert.

Best practices en tips voor klassekiezer

Om optimaal gebruik te maken van XPath-klassekiezers, kunt u deze best practices en tips overwegen:

  • Gebruik de eenvoudigste uitdrukking waarmee de klus kan worden geklaard. Soms een simpele //element[@class=‘classname‘] is alles wat je nodig hebt. Vermijd onnodige complexiteit.

  • Combineer klassenkiezers indien nodig met andere criteria. U kunt predikaten gebruiken om elementen te selecteren op basis van meerdere attributen (bijv //button[@class=‘primary‘ and @type=‘submit‘]), of combineer klassenselectors met positionele selectors (bijv (//div[@class=‘row‘])[2] om de tweede rij te selecteren).

  • Houd rekening met wijzigingen in de HTML van de site. Klassen worden vaak gebruikt voor stijldoeleinden, wat betekent dat ze vaker kunnen veranderen dan andere attributen zoals ID's. Als uw schraper kapot gaat, controleer dan of de klassen waarop u zich richt nog steeds op de pagina aanwezig zijn.

  • Gebruik relatieve XPaths om herhaling van lange expressies te voorkomen. Als u al een bovenliggend element heeft geselecteerd, kunt u een punt (.) om kinderen ten opzichte van dat element te selecteren, zoals //div[@class=‘container‘]/./p.

  • Overweeg andere methoden zoals CSS-selectors of regex voor specifieke gebruiksscenario's. Hoewel XPath veelzijdig is, kunnen er momenten zijn waarop een andere aanpak eenvoudiger of sneller is. CSS-selectors zijn performant en zeer geschikt voor basisselectietaken. Reguliere expressies kunnen handig zijn voor het matchen van patronen of het extraheren van gegevens uit tekstinhoud.

Voorbeelden van klassenselectie

Laten we een paar voorbeelden bekijken van klassenselectie in actie met behulp van Python en de lxml bibliotheek.

Stel dat we deze HTML hebben:

<html>
    <body>
        <div class="container">
            <p class="highlight">Paragraph 1</p>
            <p>Paragraph 2</p>
            <p class="highlight">Paragraph 3</p>
        </div>
    </body>  
</html>

Alles selecteren <p> elementen met een klasse "highlight", die we kunnen gebruiken contains():

from lxml import html

tree = html.fromstring(html_string)
highlighted_paragraphs = tree.xpath(‘//p[contains(@class,"highlight")]‘)

for paragraph in highlighted_paragraphs:
    print(paragraph.text)

# Output: 
# Paragraph 1
# Paragraph 3

Als we alleen de <p> elementen waar de klasse zich bevindt precies "highlight", zouden we gebruiken:

exact_match_paragraphs = tree.xpath(‘//p[@class="highlight"]‘)

Om het <div> element en zoek dan <p> elementen met de klasse "highlight" erin, kunnen we een relatieve XPath gebruiken:

div = tree.xpath(‘//div[@class="container"]‘)[0]
highlighted_paragraphs = div.xpath(‘./p[contains(@class,"highlight")]‘)

Alles bij Elkaar

In deze handleiding hebben we uitgebreid gekeken naar hoe je elementen per klasse kunt selecteren met behulp van XPath. We hebben de twee belangrijkste benaderingen besproken – het gebruik van de functie contain() en het exact matchen van klassennamen – evenals de belangrijkste overwegingen, best practices en voorbeelden.

Om samen te vatten:

  • XPath is een krachtige querytaal voor het selecteren van elementen in HTML/XML-documenten
  • Klassen zijn een manier om categorieën aan elementen toe te wijzen, vaak voor stijl- of selectiedoeleinden
  • De contains(@class,‘classname‘) aanpak selecteert elementen die de opgegeven klasse bevatten als onderdeel van hun klasse-attribuutwaarde
  • De [@class=‘classname‘] aanpak selecteert elementen waarbij het klasse-attribuut exact overeenkomt met de opgegeven klasse
  • XPath-klasseselectors zijn hoofdlettergevoelig en kunnen worden gecombineerd met andere criteria of relatieve selectors
  • Het is belangrijk om de eenvoudigste uitdrukking te kiezen die uw doel bereikt, en om rekening te houden met wijzigingen in de HTML van de site in de loop van de tijd

Gewapend met deze kennis bent u goed uitgerust om een ​​breed scala aan webscraping-uitdagingen aan te pakken met behulp van XPath en klassenkiezers. Of je nu een beginner of een doorgewinterde professional bent, het is een essentiële vaardigheid om te begrijpen hoe je precies de elementen kunt targeten die je nodig hebt.

Wanneer u deze technieken in de praktijk brengt, moet u er rekening mee houden dat u altijd respectvol moet zijn tegenover website-eigenaren en dat u zich moet houden aan de toepasselijke servicevoorwaarden of robots.txt-bestanden. Veel plezier met schrapen!

Doe mee aan het gesprek

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