Salta al contenuto

Come selezionare gli elementi in base al testo in XPath

Durante lo scraping dei siti Web, spesso è necessario selezionare gli elementi della pagina in base al loro contenuto testuale. Ciò ti consente di individuare con precisione i dati che desideri estrarre. XPath, un linguaggio di query per la selezione dei nodi nei documenti XML e HTML, fornisce alcuni modi per farlo utilizzando il file contains() ed text() funzioni.

In questa guida esamineremo in modo approfondito come sfruttare queste tecniche di selezione del testo nelle espressioni XPath. Tratteremo la sintassi, esamineremo esempi e discuteremo alcune best practice per aiutarti a selezionare in modo efficace gli elementi in base al loro contenuto testuale durante il web scraping.

Utilizzo di contiene() per selezionare elementi contenenti testo

L'XPath contains() La funzione consente di selezionare elementi che contengono una sottostringa di testo specifica. Sono necessari due argomenti:

  1. Un set di nodi in cui effettuare la ricerca
  2. La sottostringa di testo da abbinare

La sintassi è simile a:

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

Questo selezionerà tutto element nodi il cui contenuto testuale contiene quanto specificato substring.

Ad esempio, considera il seguente codice HTML:

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

Per selezionare tutto <li> elementi che contengono il testo "e", dovresti utilizzare:

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

Questo corrisponderebbe al terzo <li> elemento, "Pere e uva".

I contains() la funzione fa distinzione tra maiuscole e minuscole per impostazione predefinita. Per eseguire una corrispondenza senza distinzione tra maiuscole e minuscole, è possibile utilizzare il file lower-case() or upper-case() funzioni per normalizzare l'involucro:

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

Una caratteristica chiave di contains() è che la corrispondenza della sottostringa può estendersi su elementi figlio. Ad esempio, in questo HTML:

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

L'XPath //p[contains(text(), "Select this")] corrisponderebbe comunque a <p> tag, anche se "Select" e "this" sono separati da <em> elemento figlio.

Utilizzo di text() per selezionare gli elementi in base al testo esatto

Mentre contains() è utile per corrispondenze di testo parziali, a volte è necessario far corrispondere esattamente l'intero contenuto del testo. Questo è dove il text() entra in gioco la funzione. Seleziona gli elementi in base al loro contenuto di testo completo.

La sintassi è:

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

Ad esempio, con questo HTML:

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

L'espressione XPath //p[text()="Hello world!"] selezionerei solo il primo <p> elemento. Il secondo <p> L'elemento non corrisponde, perché il suo contenuto testuale non è esattamente "Hello world!".

a differenza di contains(), le text() La funzione corrisponde solo al contenuto testuale diretto di un elemento. Non corrisponde al testo all'interno degli elementi secondari. Ad esempio, //div[text()="Hello world!"] non corrisponderebbe a nulla nell'HTML precedente, perché il file <div> stesso non contiene direttamente il testo "Hello world!". Quel testo è all'interno del <p> elemento figlio.

Come contains(), le text() la funzione fa distinzione tra maiuscole e minuscole per impostazione predefinita. Lo stesso lower-case() or upper-case() è possibile utilizzare una soluzione alternativa per la corrispondenza senza distinzione tra maiuscole e minuscole.

Combinazione di selettori di testo con altre espressioni XPath

I selettori di testo diventano ancora più potenti se combinati con altre parti delle espressioni XPath, come nomi di tag, attributi e selettori posizionali. Ciò ti consente di creare selettori molto mirati per approfondire esattamente gli elementi di cui hai bisogno.

Ad esempio, potresti utilizzare il seguente XPath per selezionare <a> elementi che contengono la parola "click" nel testo del collegamento, ma solo se hanno anche la classe "cta-button":

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

Oppure questa espressione per selezionare il terzo <p> elemento della pagina, ma solo se il suo contenuto testuale inizia con "Introduzione":

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

Mescolando e abbinando diversi costrutti XPath, puoi creare selettori molto specifici per gestire quasi tutti gli scenari di web scraping.

Esempi di selettori di testo con librerie Python

Diamo un'occhiata ad alcuni esempi pratici di utilizzo dei selettori di testo XPath con le comuni librerie di web scraping Python.

Esempio con lxml e request

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‘))

Esempio con 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)

Esempio con selenio

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()

Suggerimenti e buone pratiche

Quando utilizzi i selettori di testo XPath per il web scraping, tieni presente questi suggerimenti:

  1. Fai attenzione agli spazi bianchi nel testo che stai cercando di far corrispondere. Spazi aggiuntivi o caratteri di nuova riga possono causare il fallimento dei selettori. Utilizza normalize-space() per rimuovere gli spazi bianchi iniziali e finali e comprimere gli spazi bianchi interni, se necessario.

  2. Attenzione alle maiuscole. Per impostazione predefinita, la corrispondenza del testo in XPath fa distinzione tra maiuscole e minuscole. Utilizzare lower-case() o upper-case() per la corrispondenza senza distinzione tra maiuscole e minuscole.

  3. Evita selettori di testo eccessivamente generici, poiché possono corrispondere a elementi non desiderati. Prova a combinare selettori di testo con nomi di elementi o attributi per renderli più specifici.

  4. Metti sempre alla prova i tuoi selettori rispetto al contenuto reale e attuale della pagina. I siti Web cambiano frequentemente, quindi i selettori che funzionavano ieri potrebbero non funzionare oggi se il contenuto del testo è stato aggiornato.

  5. Se un sito Web presenta una formattazione incoerente o contenuti generati dagli utenti, i selettori di testo potrebbero essere inaffidabili. In questi casi, spesso è meglio utilizzare selettori strutturali basati sui nomi degli elementi, sugli attributi o sulla posizione nell'albero del documento.

Conclusione

XPath fornisce modi potenti per selezionare gli elementi in base al loro contenuto di testo, utilizzando il file contains() ed text() funzioni. contains() è utile per abbinare elementi che contengono una sottostringa di testo specifica, mentre text() seleziona gli elementi in base al loro contenuto esatto e completo.

Questi selettori di testo sono ancora più efficaci se combinati con altre espressioni XPath per creare selettori di elementi altamente mirati per il web scraping.

Al di là di solo contains() ed text(), XPath ha molte altre funzioni utili per lavorare con il testo, come starts-with(), ends-with(), normalize-space()e altro ancora. Investi un po' di tempo nell'apprendimento di queste e altre parti chiave della sintassi XPath.

Con una solida conoscenza dei selettori di testo XPath, sei sulla buona strada per poter individuare ed estrarre con precisione i dati di cui hai bisogno dalle pagine web. Buon raschiamento!

Partecipa alla conversazione

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