Salta al contenuto

Come trovare gli elementi di XPath in Selenium (guida completa)

In qualità di esperto di web scraping e proxy con oltre 5 anni di esperienza, ho trovato XPath una delle tecniche più utili e versatili per individuare elementi web. Padroneggiare i selettori XPath può aiutarti a estrarre i dati anche dalle pagine Web più complesse con precisione.

In questa guida completa di oltre 3200 parole, condividerò tutto ciò che ho imparato sulla ricerca e l'interazione con gli elementi utilizzando XPath in Selenium.

Cos'è esattamente XPath?

Prima di approfondire l'utilizzo, è importante capire cos'è effettivamente XPath.

XPath sta per XML Path Language. È un linguaggio di query per selezionare nodi da un documento XML. Essenzialmente, XPath fornisce una sintassi per descrivere parti di una struttura XML.

Poiché l'HTML è strutturato come XML, con elementi nidificati come tag di apertura e chiusura, XPath può essere utilizzato anche per indirizzare parti di un documento HTML.

Secondo w3schools, alcuni fatti chiave su XPath:

  • XPath utilizza espressioni di percorso per selezionare nodi o set di nodi in un documento XML
  • Queste espressioni di percorso assomigliano molto alle espressioni di percorso che vedi quando lavori con un filesystem di computer tradizionale
  • XPath contiene oltre 100 funzioni integrate per manipolare stringhe, numeri, booleani, set di nodi, ecc.
  • XPath è un elemento importante in XSLT (Extensible Stylesheet Language Transformations)

In sintesi, XPath è un potente linguaggio di interrogazione ed estrazione progettato per la navigazione di documenti XML.

In che modo XPath si collega al selenio?

Selenium è un framework di automazione per il controllo dei browser web. Quando carichi una pagina web in Selenium, il contenuto HTML viene analizzato in una struttura DOM (Document Object Model).

Il DOM rappresenta visivamente la pagina come un albero di elementi HTML nidificati.

XPath può essere utilizzato per attraversare il DOM per trovare e interagire con elementi specifici sulla pagina.

Ad esempio, considera questo HTML semplificato:

<html>
<body>

  <div>
    <p>Hello World!</p>
  </div>

  <div>
    <img src="logo.png"/>
  </div>

</body>
</html>

Il DOM potrebbe assomigliare a questo:

       html
       /  \
     body   
     / \     
    div  div
      |    |
     p    img

È quindi possibile utilizzare le espressioni XPath per eseguire query sugli elementi all'interno di questa struttura:

/html/body/div[1]/p
//div/img

Ciò rende XPath incredibilmente utile per automatizzare azioni su parti specifiche di una pagina con Selenium.

Nozioni di base sulla sintassi XPath

Ora che hai compreso il ruolo di XPath, analizziamo la sintassi.

XPath utilizza espressioni di percorso per selezionare elementi e attributi in un documento XML. Le espressioni sembrano molto simili ai percorsi in un filesystem come sul tuo computer:

/Users/jsmith/Documents/letter.docx

La barra / consente di spostarsi verso il basso attraverso le cartelle nidificate.

Alcuni modelli XPath di base:

  • nodename – Seleziona tutti i nodi con il nome nodename
  • / – Seleziona dal nodo radice
  • // – Seleziona i nodi a qualsiasi profondità
  • . – Seleziona il nodo corrente
  • .. – Seleziona il nodo principale
  • @ – Seleziona gli attributi

Per esempio:

/html/body/div - Selects all div tags under body
//div - Selects all div tags anywhere 
div[@class=‘header‘] - Selects div tags with matching class attribute

Ci sono molte altre sintassi specializzate che tratteremo in questa guida. Ma questi modelli di base ti consentono di iniziare a creare selettori XPath mirati.

Secondo la mia esperienza, padroneggiare solo 5-10 espressioni XPath fondamentali ti consentirà di individuare gli elementi nella maggior parte dei siti web.

Trovare elementi Web con find_element ed find_elements

Selenium fornisce due metodi principali per individuare gli elementi utilizzando XPath:

  • find_element() – Restituisce un singolo WebElement corrispondente all'XPath
  • find_elements() – Restituisce un elenco di tutti i WebElements corrispondenti

Ecco un semplice esempio di utilizzo:

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

driver = webdriver.Chrome()
driver.get("https://www.example.com")

# Find single element
element = driver.find_element(By.XPATH, ‘//img‘) 

# Find multiple elements 
elements = driver.find_elements(By.XPATH, ‘//div‘)

Con questi due metodi, puoi iniziare a sfruttare la potenza di XPath per interagire con parti specifiche di una pagina Web in modo automatizzato.

Suggerimenti per la ricerca degli elementi

Sulla base dei miei anni di esperienza, ecco alcuni suggerimenti chiave durante la creazione di selettori XPath:

  • Ispeziona l'origine HTML – La visualizzazione del contenuto HTML non elaborato consente di identificare attributi e modelli univoci per gli elementi target. Tutti i browser moderni dispongono di strumenti di sviluppo per visualizzare l'origine.

  • Copia XPath nel browser – La maggior parte degli strumenti di sviluppo del browser includono anche funzionalità per copiare l'XPath completo di un elemento. È quindi possibile modificare e semplificare questi selettori di base.

  • Concentrarsi sull'ID – L'attributo id di un elemento di pagina fornisce il selettore più diretto e univoco come //input[@id=‘search‘].

  • Le lezioni aiutano – Gli attributi della classe consentono query più flessibili come //div[@class=‘results‘] anche se non del tutto unico.

  • Evita gli indici – Fare affidamento su indici di posizione come [1], [2] porta a localizzatori fragili.

  • Più corto è meglio – XPath conciso con passaggi nidificati minimi aiuta a evitare query lente o corrispondenze errate.

Padroneggiare queste linee guida ti aiuterà a costruire robusti selettori XPath che individuano in modo elegante gli elementi della pagina richiesti.

Modelli e ricette XPath comuni

Poiché ora hai compreso le nozioni di base, diamo un'occhiata ad alcuni esempi comuni di modelli XPath:

Seleziona per valore attributo

//input[@type=‘submit‘]
//a[@href=‘contact.html‘]

Corrispondenza parziale degli attributi

//input[contains(@name, ‘search‘)]
//div[starts-with(@class, ‘result‘)]

Seleziona Corrispondenza testo

//p[text()=‘Hello World‘] 
//h2[contains(text(), ‘Welcome‘)]

Seleziona Bambini

/div/p
//tbody/tr/td

Selezione indicizzata

(//input[@type=‘button‘])[2]

Selezione concatenata

//div[@id=‘nav‘]/ul/li/a 

Seguire i fratelli

//h1[text()=‘Articles‘]/following-sibling::p

Consiglio di acquisire familiarità con ciascuna di queste tecniche comuni. Costituiscono un toolkit di competenze XPath che ti sarà utile durante la costruzione di query robuste.

Esempio di raschiatura

Esaminiamo un esempio di script di web scraping utilizzando Selenium e XPath in Python.

Estrarremo i dati del prodotto da un sito di e-commerce:

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

# Initialize driver 
driver = webdriver.Chrome(‘/path/to/chromedriver‘)

# Load page
driver.get(‘https://www.example.com‘)

# Click shop link
shop_link = driver.find_element(By.LINK_TEXT, ‘Shop‘)
shop_link.click()

# Wait for new page to load
time.sleep(5)  

# Extract product details
product = driver.find_element(By.XPATH, ‘//div[@class="product"][1]‘)
name = product.find_element(By.XPATH, ‘.//h2‘).text
description = product.find_element(By.XPATH, ‘.//p‘).text 
price = product.find_element(By.XPATH, ‘.//span[@class="price"]‘).text

print(name, description, price)

# Close browser
driver.quit()

Ciò dimostra come XPath possa essere utilizzato per individuare con precisione gli elementi per lo scraping dei dati delle pagine nidificate.

Problemi e soluzioni comuni

Ecco alcuni problemi comuni che possono verificarsi quando si utilizzano i localizzatori XPath in Selenium insieme alle strategie di mitigazione:

timeout

Se le pagine richiedono tempo per essere caricate, utilizza attese implicite ed esplicite:

from selenium.webdriver.common.by import WebDriverWait 

driver.implicitly_wait(10) 

WebDriverWait(driver, 20).until(expected_conditions)

Elementi stantii

Se il DOM cambia, riposiziona gli elementi per evitare eccezioni di elementi obsoleti:

elements = driver.find_elements(By.XPATH, ‘//div‘)
# DOM updates, elements now stale
elements = driver.find_elements(By.XPATH, ‘//div‘) 

Compatibilità con i browser

Alcune funzionalità avanzate di XPath potrebbero non funzionare su tutti i browser. Testare il comportamento e semplificarlo se necessario.

Performance lenta

Espressioni XPath molto complesse possono rallentare l'esecuzione dei test. Semplificare la struttura ove possibile.

Visibilità

Gli elementi corrispondenti potrebbero non essere necessariamente visibili. Assicurati che vengano visualizzati prima di interagire.

L’esperienza aiuta ad anticipare questi problemi: diventano molto più facili da gestire nel tempo.

Alternative XPath

Sebbene XPath sia potente, non è sempre la soluzione migliore. Ecco alcune alternative comuni:

Selettori CSS

I selettori CSS forniscono un modo semplice e familiare per trovare elementi:

driver.find_element(By.CSS_SELECTOR, ‘input[type="submit"]‘)
driver.find_element(By.CSS_SELECTOR, ‘.search-box‘) 

Attributi ID e Nome

Se gli ID o i nomi sono veramente univoci, utilizza:

driver.find_element(By.ID, ‘search‘)
driver.find_element(By.NAME, ‘query‘) 

link Text

La corrispondenza del testo completo del collegamento può evitare query complesse:

driver.find_element(By.LINK_TEXT, ‘Logout‘)

Valuta ogni opzione per le tue esigenze specifiche. Trovo spesso che una combinazione di XPath, CSS, ID e localizzatori di testo dei collegamenti offra la massima robustezza.

Confronto delle strategie di localizzazione

Ecco un confronto tra XPath e alcune strategie comuni di localizzazione degli elementi alternativi:

metodoEsempioVantaggiSvantaggi
XPath//div/pQuery molto flessibiliSintassi complessa
Selettore CSSrisultati div. pSintassi familiareHa come target solo classe/id/attributi
ID#modulo-di-iscrizioneMolto veloce e unicoRichiede ID
Nomenome=queryUnicoAffidati alle convenzioni di denominazione
Link al testoEsciSemplice per i collegamentiSolo per il testo del collegamento

Come puoi vedere, ogni strategia ha dei compromessi. L'uso di XPath insieme a selettori e attributi CSS può fornire una solida flessibilità al localizzatore.

Utilizzo avanzato con lxml e parsel

Sebbene Selenium disponga di metodi di ricerca integrati molto utili, librerie di analisi dedicate come lxml e parsel offrono potenza aggiuntiva per attività di scraping complesse.

Queste librerie forniscono un solido supporto XPath insieme a molte altre funzionalità come:

  • Parser HTML e XML veloci
  • Supporto per XPath 1.0 e 2.0+
  • Un'ampia gamma di funzioni e operatori XPath
  • Collegamenti utili per l'analisi dell'HTML
  • Integrazione con framework popolari come Scrapy

Alcuni esempi di utilizzo:

from lxml import html

tree = html.parse(‘page.html‘)
p_elements = tree.xpath(‘//p‘)

from parsel import Selector
sel = Selector(text=html_text)
links = sel.xpath(‘//a/@href‘).getall() 

Per lavori di scraping più pesanti, spesso utilizzo queste librerie per integrare le funzionalità integrate di Selenium.

Conclusione e lezioni chiave

La ricerca di elementi tramite XPath è una tecnica essenziale per chiunque utilizzi Selenium per l'automazione dei test o il web scraping.

Ecco alcune lezioni chiave che ho imparato in oltre 5 anni di utilizzo di XPath per interagire con siti complessi:

  • Inizia imparando alcuni modelli XPath fondamentali come la corrispondenza degli attributi, la selezione del testo, la selezione del figlio, ecc. La maggior parte dell'utilizzo si basa su questi fondamenti.

  • Trovare un equilibrio tra query concise ma uniche richiede pratica. È un'arte tanto quanto una scienza.

  • Acquisisci familiarità con gli strumenti di sviluppo del browser per controllare l'origine e copiare le stringhe XPath iniziali.

  • Integra XPath con selettori CSS e attributi id/nome quando appropriato. La combinazione di approcci porta alla massima robustezza.

  • Considera le librerie di analisi XPath avanzate come lxml e parsel per una maggiore capacità di scraping oltre Selenium.

  • Impara ad anticipare e gestire problemi comuni come elementi obsoleti e timeout nel tempo attraverso l'esperienza.

Spero che questa guida abbia fornito un riferimento completo per sbloccare la potenza della selezione degli elementi XPath con Selenium. Fammi sapere se hai altre domande specifiche!

Partecipa alla conversazione

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