Salta al contenuto

Come utilizzare i selettori XPath per il Web Scraping in Python

Se stai cercando di estrarre dati da pagine web utilizzando Python, XPath è uno strumento essenziale da avere nel tuo toolkit di web scraping. XPath fornisce un modo per navigare attraverso la struttura HTML di una pagina e individuare gli elementi e i dati esatti di cui hai bisogno.

In questa guida esamineremo le nozioni di base di XPath e dimostreremo come sfruttare la sua potenza per il web scraping con Python. Alla fine, sarai pronto per affrontare un'ampia varietà di attività di scraping utilizzando XPath per estrarre chirurgicamente i dati che stai cercando.

Cos'è XPath?

XPath sta per XML Path Language. È un linguaggio di query per selezionare nodi da un documento XML o HTML. Con XPath, specifichi un modello da abbinare alla struttura del documento e restituirà tutti gli elementi che corrispondono a quel modello.

Sebbene originariamente progettato per XML, XPath funziona altrettanto bene con HTML, rendendolo ideale per scopi di web scraping. Fornisce un'alternativa più potente e flessibile ai selettori CSS o alle espressioni regolari.

Nozioni di base sulla sintassi XPath

Per iniziare a utilizzare XPath, dovrai comprendere gli elementi costitutivi della sintassi XPath. Ecco i concetti chiave:

Selezione dei nodi in base al nome del tag

L'espressione XPath più elementare consiste semplicemente nel specificare il nome di un tag. Per esempio:

  • //h1 seleziona tutti i <h1> elementi di intestazione della pagina
  • //p seleziona tutti i <p> elementi del paragrafo
  • //img seleziona tutti i <img> elementi dell'immagine

Selezione dei nodi per attributo

È possibile selezionare elementi che hanno un attributo o un valore di attributo specifico utilizzando @ sintassi:

  • //*[@class="highlighted"] seleziona tutti gli elementi che hanno la classe "evidenziata"
  • //a[@href] seleziona tutto <a> elementi di ancoraggio che hanno un attributo href
  • //img[@alt="Logo"] seleziona <img> elementi con un testo alternativo "Logo"

Selezione dei nodi per posizione

È possibile selezionare i nodi in base alla loro posizione utilizzando parentesi quadre [] e un indice numerico:

  • //ul/li[1] seleziona il primo <li> elemento all'interno di ciascuno <ul> lista non ordinata
  • //table/tr[last()] seleziona l'ultimo <tr> fila in ciascuno <table>
  • //ol/li[position() <= 3] seleziona i primi tre <li> elementi in ciascuno <ol> lista ordinata

Selezione dei nodi per relazione

XPath ti consente di navigare su e giù nell'albero del documento per selezionare gli elementi in base ai loro antenati, discendenti, fratelli, ecc.:

  • //div[@class="content"]/* seleziona tutti gli elementi figli di <div> elementi con classe "contenuto"
  • //p/.. seleziona gli elementi principali di tutti <p> paragrafi
  • //h1/following-sibling::p seleziona tutto <p> elementi che sono fratelli dopo un <h1> intestazione
  • //section//img seleziona tutto <img> elementi che discendono da a <section> a qualsiasi livello

Predicati e funzioni

XPath supporta un'ampia gamma di predicati e funzioni per perfezionare ulteriormente le selezioni:

  • //p[contains(text(),"scrapy")] seleziona <p> elementi che contengono il testo "scrapy"
  • //a[starts-with(@href,"https")] seleziona <a> elementi in cui href inizia con "https"
  • //ul[count(li) > 10] seleziona <ul> elementi che ne contengono più di 10 <li> elementi
  • //img[string-length(@alt) > 0] seleziona <img> elementi con un attributo alt non vuoto

Utilizzo di XPath con lxml e BeautifulSoup

Ora che hai compreso le basi della sintassi XPath, vediamo come puoi usarlo in Python con le popolari librerie lxml e BeautifulSoup. Esamineremo un esempio di scraping del testo dell'intestazione principale dalla home page di ScrapingBee.

Analisi dell'HTML con lxml e BeautifulSoup

Per prima cosa dobbiamo recuperare l'HTML della pagina web utilizzando la libreria delle richieste e analizzarlo in una struttura ad albero su cui possiamo eseguire query con XPath. Utilizzeremo BeautifulSoup per analizzare HTML e lxml per valutare le nostre espressioni XPath:

import requests
from bs4 import BeautifulSoup
from lxml import etree

html = requests.get("https://scrapingbee.com") 
soup = BeautifulSoup(html.text, "html.parser")
dom = etree.HTML(str(soup))

Qui noi:

  1. Recupera l'HTML utilizzando requests.get()
  2. Analizza la stringa HTML in un oggetto BeautifulSoup utilizzando html.parser
  3. Converti l'oggetto BeautifulSoup in una stringa in modo da poterlo analizzare con lxml etree.HTML() function
  4. Analizza la stringa in un lxml Element oggetto che possiamo interrogare utilizzando XPath

Costruzione e valutazione delle espressioni XPath

Ora che abbiamo un albero HTML analizzato, possiamo costruire un'espressione XPath per selezionare il file main <h1> titolo della pagina:

heading_xpath = ‘//h1‘

Per valutare questo XPath rispetto al nostro documento HTML analizzato, utilizziamo il file xpath() Metodo:

heading_elements = dom.xpath(heading_xpath)

I dom.xpath() call restituirà un elenco di tutti gli elementi che corrispondono al nostro selettore XPath. In questo caso, dovrebbe esserci solo una corrispondenza <h1> elemento.

Estrazione di testo e attributi

Una volta che abbiamo un riferimento all'elemento, possiamo facilmente estrarne il testo e gli eventuali attributi utilizzando le proprietà di lxml:

heading_text = heading_elements[0].text
print(heading_text)
# Tired of getting blocked while scraping the web?  

Abbiamo estratto con successo il testo dell'intestazione con una sola riga di XPath! Potremmo anche accedere ai valori degli attributi dell'elemento utilizzando get():

heading_id = heading_elements[0].get(‘id‘)  

Utilizzo di XPath con selenio

Un approccio alternativo consiste nell'utilizzare Selenium per automatizzare e raschiare siti Web dinamici che richiedono JavaScript. Selenium fornisce i propri metodi per selezionare gli elementi utilizzando stringhe XPath.

Configurazione del Selenium WebDriver

Per iniziare con Selenium, devi prima installare il pacchetto Selenium e un driver web per il browser che desideri utilizzare. Ecco come puoi configurare un driver Chrome:

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

driver_path = "/path/to/chromedriver"  
driver = webdriver.Chrome(driver_path)

Assicurati di scaricare la versione ChromeDriver appropriata per la tua installazione di Chrome e di fornire il percorso dell'eseguibile.

Trovare elementi con XPath

Con il driver configurato, possiamo navigare in una pagina web e iniziare a trovare gli elementi. Il WebDriver di Selenium fornisce a find_element metodo che accetta un localizzatore XPath:

driver.get("https://scrapingbee.com")

heading_xpath = "//h1"
heading_element = driver.find_element(By.XPATH, heading_xpath)

Similmente all'esempio lxml, questo troverà il primo <h1> elemento nella pagina. Se vuoi trovare tutti gli elementi che corrispondono a un XPath, usa find_elements anziché:

paragraph_xpath = "//p"
paragraph_elements = driver.find_elements(By.XPATH, paragraph_xpath)  

Estrazione di testo e attributi

Una volta che hai un riferimento a un elemento web, puoi accedere alle sue proprietà come contenuto testuale e attributi:

heading_text = heading_element.text
print(heading_text)  
# Tired of getting blocked while scraping the web?

paragraph_id = paragraph_elements[0].get_attribute("id")

L'estrazione dei dati con Selenium e XPath è abbastanza semplice, ma tieni presente che Selenium è generalmente più lento rispetto all'utilizzo di una semplice libreria di richieste HTTP poiché esegue un vero browser.

Suggerimenti e buone pratiche

Quando inizi a utilizzare XPath per il web scraping, ecco alcuni suggerimenti e trucchi da tenere a mente:

Utilizza Chrome DevTools per testare le espressioni XPath

Quando si costruiscono selettori XPath, è molto utile testarli in modo interattivo per assicurarsi che corrispondano a ciò che ci si aspetta. I Chrome DevTools forniscono un modo semplice per farlo:

  1. Fare clic con il tasto destro su un elemento e selezionare "Ispeziona" per aprire il pannello Elementi DevTools
  2. Premi Ctrl+F per aprire la casella di ricerca
  3. Inserisci la tua espressione XPath per evidenziare gli elementi corrispondenti nella pagina

Gestire markup incoerenti

I siti Web in natura hanno spesso markup HTML incoerenti o non funzionanti che possono far scattare i selettori XPath. È una buona idea utilizzare una libreria come BeautifulSoup per ripulire e normalizzare l'HTML prima di analizzarlo con lxml.

Scrivi XPath robusto e manutenibile

Per ridurre al minimo le possibilità che il tuo scraper si rompa a causa di modifiche al layout nel sito di destinazione, prova a scrivere espressioni XPath il più specifiche possibile ma non più specifiche del necessario. Preferisci la selezione in base a proprietà semantiche come nomi di tag, ID e attributi di dati piuttosto che affidarti alla struttura specifica del markup.

È anche una buona idea suddividere le espressioni XPath complesse in variabili con nomi descrittivi per migliorare la leggibilità e la manutenibilità.

Risultati nella cache per migliorare le prestazioni

Se raccogli grandi quantità di dati o visiti le stesse pagine più volte, valuta la possibilità di memorizzare nella cache i risultati HTML e XPath analizzati per evitare richieste di rete non necessarie e sovraccarico di analisi. Puoi utilizzare un dizionario semplice o una soluzione più solida come MongoDB o Redis per la memorizzazione nella cache.

Conclusione

XPath è uno strumento incredibilmente potente per estrarre con precisione i dati dalle pagine HTML. Con una conoscenza di base della sintassi e la capacità di tradurre i selettori CSS nei loro equivalenti XPath, puoi gestire un'ampia varietà di attività di web scraping.

Le librerie Python come lxml, BeautifulSoup e Selenium forniscono modi semplici per integrare XPath nei flussi di lavoro di scraping. A seconda delle tue esigenze specifiche e delle caratteristiche del sito di destinazione, puoi scegliere l'approccio che funziona meglio.

Mentre continui il tuo viaggio nel web scraping con Python e XPath, assicurati sempre di rispettare i termini di servizio del sito web e le restrizioni del file robots.txt. E ricorda di rispolverare i fondamenti delle funzioni e degli operatori XPath: rimarrai stupito di quanto puoi ottenere con solo poche righe di XPath intelligente!

Partecipa alla conversazione

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