Salta al contenuto

Come selezionare gli elementi per classe in XPath: The Ultimate Guide

Se stai cercando di estrarre dati da siti web, è probabile che dovrai selezionare elementi specifici in base alle loro classi. Le classi sono un modo fondamentale per categorizzare e applicare stili agli elementi in HTML. Fortunatamente, XPath offre modi efficaci per selezionare gli elementi in base al loro attributo di classe.

In questa guida approfondita, spiegheremo esattamente come selezionare gli elementi per classe utilizzando XPath. Che tu sia un principiante o un web scraper esperto, entro la fine di questo articolo navigherai abilmente nei documenti HTML e sceglierai con precisione gli elementi di cui hai bisogno. Iniziamo!

Un breve riepilogo su XPath

Prima di immergerci nei selettori di classe, esaminiamo brevemente cos'è XPath e come funziona. XPath è un linguaggio di query utilizzato per navigare e selezionare i nodi in un documento XML o HTML. Ti consente di scrivere espressioni che individuano elementi specifici in base al nome del tag, agli attributi, alla posizione e altro.

Ecco alcune cose fondamentali da sapere su XPath:

  • XPath tratta il documento come una struttura ad albero, con un nodo radice e nodi figlio che si diramano da esso
  • Le espressioni vengono valutate da sinistra a destra
  • Le barre (/) vengono utilizzate per spostarsi tra i nodi
  • Gli elementi possono essere selezionati in base al loro nome (es //div seleziona tutto <div> elementi)
  • I predicati tra parentesi quadre consentono una selezione più precisa (es //div[@id=‘main‘] seleziona <div> elementi con ID "main")

Una volta stabilite queste basi, rivolgiamo la nostra attenzione alle classi e a come sfruttarle nelle espressioni XPath.

Comprendere le classi HTML

Le classi sono un attributo HTML che consente di assegnare uno o più nomi di classe agli elementi. Vengono utilizzati principalmente per scopi di styling con i CSS, ma sono anche molto utili per prendere di mira elementi specifici durante il web scraping.

Ecco un esempio di un elemento paragrafo con due classi:

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

In questo caso, il <p> All'elemento sono applicate due classi: "highlight" e "text-center". Un elemento può avere un numero qualsiasi di classi, separate da spazi nel valore dell'attributo classe.

Una cosa da tenere a mente è che i nomi delle classi fanno distinzione tra maiuscole e minuscole. COSÌ class="highlight" ed class="Highlight" sarebbero considerate due classi diverse.

Ora che abbiamo capito cosa sono le classi HTML, vediamo come possiamo selezionare gli elementi in base alle loro classi utilizzando XPath.

Selezione di elementi per classe in XPath

XPath fornisce due modi principali per selezionare gli elementi in base al loro attributo di classe:

  1. Utilizzando la funzione contiene()
  2. Corrispondenza esatta del nome della classe

Esploriamo ciascuno di questi approcci in modo più approfondito.

Approccio 1: utilizzo della funzione contiene()

I contains() La funzione consente di selezionare elementi il ​​cui attributo class contiene un nome di classe specifico. Ecco la sintassi di base:

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

Ad esempio, per selezionare tutto <div> elementi che hanno una classe "contenitore", dovresti usare:

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

I contains() la funzione ha alcune caratteristiche chiave:

  • Fa distinzione tra maiuscole e minuscole (quindi "contenitore" e "Contenitore" verrebbero trattati come diversi)
  • Il nome della classe può apparire ovunque nel valore dell'attributo della classe
  • All'elemento possono essere applicate anche altre classi, purché contenga quella specificata

So contains(@class,‘container‘) corrisponderebbe a elementi come:

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

Ma lo sarebbe non gioco:

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

I contains() L'approccio è versatile e può essere una buona scelta quando si desidera abbinare elementi che hanno una determinata classe come parte di un file set di classi. Ma se hai bisogno di essere più preciso, potrebbe essere preferibile l’approccio successivo.

Approccio 2: corrispondenza esatta del nome della classe

Per selezionare gli elementi che hanno un attributo di classe tale di preciso corrisponde a un valore specifico, puoi utilizzare questa sintassi:

//element[@class=‘classname‘]

Ad esempio, per selezionare <p> elementi in cui la classe è esattamente "evidenzia", ​​dovresti utilizzare:

//p[@class=‘highlight‘]

Questa espressione corrisponderebbe a:

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

Ma no:

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

Come puoi vedere, l'approccio della corrispondenza esatta è più rigoroso. L'attributo class deve contenere esclusivamente il nome della classe specificata per corrispondere. Non possono essere presenti altre classi e il caso deve corrispondere esattamente.

Questo approccio è utile quando è necessario essere molto precisi nella selezione degli elementi e si desidera evitare la corrispondenza accidentale di elementi che contengono la classe come parte di un insieme più ampio.

XPath e classi: considerazioni chiave

Quando si utilizza XPath per selezionare gli elementi per classe, ci sono alcune cose importanti da tenere a mente:

  • I nomi delle classi fanno distinzione tra maiuscole e minuscole. Come accennato in precedenza, "evidenzia" e "Evidenzia" vengono trattati come nomi di classi distinti. Assicurati che le tue espressioni XPath corrispondano esattamente al caso.

  • Gli elementi possono avere più classi. È molto comune che agli elementi venga applicata più di una classe, separata da spazi. IL contains() L'approccio corrisponderà agli elementi purché contengano la classe specificata da qualche parte nel loro attributo di classe.

  • La corrispondenza esatta è più precisa ma meno flessibile. Se si utilizza [@class=‘classname‘], l'attributo class deve esclusivamente contenere quella classe. Se sono applicate altre classi, l'elemento non verrà abbinato. In contrasto, contains(@class,‘classname‘) corrisponderà finché la classe apparirà da qualche parte nel valore dell'attributo.

  • XPath è supportato dalla maggior parte degli strumenti e delle librerie di web scraping. Che tu stia utilizzando Python con BeautifulSoup o Scrapy, JavaScript con Puppeteer o Cheerio o un altro linguaggio/framework, probabilmente sarai in grado di utilizzare le espressioni XPath per estrarre i dati. La sintassi per la selezione della classe rimane la stessa.

  • Le prestazioni sono importanti per la raschiatura su larga scala. Sebbene XPath sia molto potente, può anche essere più lento di altri metodi come i selettori CSS, soprattutto per le espressioni più complesse. Se stai raccogliendo un gran numero di pagine, vale la pena confrontare diversi approcci per vedere quale offre le migliori prestazioni.

Procedure consigliate e suggerimenti per il selettore di classi

Per ottenere il massimo dai selettori di classi XPath, prendi in considerazione queste best practice e suggerimenti:

  • Usa l'espressione più semplice che porta a termine il lavoro. A volte un semplice //element[@class=‘classname‘] é tutto quello di cui hai bisogno. Evita inutili complessità.

  • Combina i selettori di classe con altri criteri quando necessario. È possibile utilizzare i predicati per selezionare elementi in base a più attributi (ad es //button[@class=‘primary‘ and @type=‘submit‘]), oppure combinare selettori di classe con selettori posizionali (es (//div[@class=‘row‘])[2] per selezionare la seconda riga).

  • Fai attenzione alle modifiche all'HTML del sito. Le classi vengono spesso utilizzate per scopi di styling, il che significa che possono cambiare più frequentemente rispetto ad altri attributi come gli ID. Se il tuo raschietto si rompe, ricontrolla che le classi che stai prendendo di mira siano ancora presenti sulla pagina.

  • Utilizzare XPath relativi per evitare di ripetere espressioni lunghe. Se hai già selezionato un elemento genitore, puoi utilizzare un punto (.) per selezionare i figli relativi a quell'elemento, come //div[@class=‘container‘]/./p.

  • Considera altri metodi come i selettori CSS o le espressioni regolari per casi d'uso specifici. Sebbene XPath sia versatile, potrebbero esserci momenti in cui un altro approccio è più semplice o più veloce. I selettori CSS sono performanti e adatti per attività di selezione di base. Le espressioni regolari possono essere utili per la corrispondenza di modelli o per estrarre dati dal contenuto di testo.

Esempi di selezione di classi

Esaminiamo alcuni esempi di selezione di classi in azione utilizzando Python e il lxml biblioteca.

Supponiamo di avere questo HTML:

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

Per selezionare tutto <p> elementi con una classe di "evidenziazione", possiamo usare 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

Se volessimo selezionare solo il <p> elementi in cui si trova la classe di preciso "evidenziare", useremmo:

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

Per selezionare il file <div> elemento e poi trova <p> elementi con al suo interno la classe "highlight", possiamo utilizzare un XPath relativo:

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

Putting It All Together

In questa guida abbiamo esaminato in modo approfondito come selezionare gli elementi per classe utilizzando XPath. Abbiamo trattato i due approcci principali, ovvero l'utilizzo della funzione contiene() e la corrispondenza esatta del nome della classe, nonché considerazioni chiave, best practice ed esempi.

Per riassumere:

  • XPath è un potente linguaggio di query per la selezione di elementi nei documenti HTML/XML
  • Le classi rappresentano un modo per assegnare categorie agli elementi, spesso per scopi di stile o selezione
  • I contains(@class,‘classname‘) L'approccio seleziona gli elementi che contengono la classe specificata come parte del valore dell'attributo di classe
  • I [@class=‘classname‘] L'approccio seleziona gli elementi in cui l'attributo class corrisponde esattamente alla classe specificata
  • I selettori di classe XPath fanno distinzione tra maiuscole e minuscole e possono essere combinati con altri criteri o selettori relativi
  • È importante scegliere l'espressione più semplice che raggiunga il tuo obiettivo e prestare attenzione alle modifiche apportate all'HTML del sito nel tempo

Grazie a queste conoscenze, sei ben attrezzato per affrontare un'ampia varietà di sfide di web scraping utilizzando XPath e selettori di classe. Che tu sia un principiante o un professionista esperto, capire come individuare con precisione gli elementi di cui hai bisogno è un'abilità essenziale.

Quando metti in pratica queste tecniche, ricorda di essere sempre rispettoso nei confronti dei proprietari dei siti web e di rispettare tutti i termini di servizio applicabili o i file robots.txt. Buon raschiamento!

Partecipa alla conversazione

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati con *