Il web scraping è diventato un'abilità essenziale per gli sviluppatori Python, i data scientist e gli appassionati di web scraping. Sia che si tratti di estrarre dati per l'analisi, di costruire uno strumento di comparazione dei prezzi o di automatizzare l'estrazione di contenuti, il web parsing è al centro di ognuna di queste attività. Ma cosa rende il parsing del web efficiente e facile da usare per i principianti? Ecco Parsel, unapotente libreria in Python che semplifica l'analisi dell'HTML e l'estrazione dei dati.
Parsel è una libreria Python leggera, progettata per il parsing di HTML/XML e l'estrazione di dati. Costruito pensando al web scraping, Parsel semplifica l'interazione con le strutture delle pagine web utilizzando potenti selettori come XPath e CSS. Questi strumenti consentono di individuare ed estrarre con precisione elementi o attributi specifici dalle pagine web. L'integrazione di Parsel con l'ecosistema Python significa anche che funziona perfettamente con librerie come `requests` e `httpx` per il recupero di contenuti web.
Il parsing HTML è il processo di scomposizione di un documento HTML nei suoi componenti strutturali, come i tag, gli attributi e il Document Object Model (DOM). Parsel utilizza questa struttura per individuare ed estrarre con precisione i dati necessari.
I documenti HTML sono costruiti utilizzando:
<h1>
, <p>
, <img>
).id
, classe
, href
).I selettori XPath e CSS sono linguaggi di interrogazione utilizzati per selezionare elementi in un documento HTML:
Ulteriori informazioni sui selezionatori sono disponibili qui.
Prima di iniziare a utilizzare Parsel, accertatevi di quanto segue:
pip installa le richieste di parsel
Parsel consente di analizzare un elemento semplicemente conoscendo il nome della classe o l'ID. Ciò è particolarmente utile quando si tratta di elementi specifici di una pagina web per l'estrazione di dati.
Per dimostrarlo, utilizzeremo questo sito web di esempio. Ci concentreremo sull'estrazione dei dati da un elemento con il nome della classe prodotto_pod
che rappresenta una singola voce del libro.
Di seguito è riportato un esempio della sua struttura HTML:
Da questo elemento estrarremo:
importare richieste
da parsel import Selector
# Recupera la pagina web
url = "https://books.toscrape.com/"
risposta = requests.get(url)
selettore = Selettore(response.text)
# Selezionare il primo prodotto per classe
prodotto = selector.css("article.product_pod").get()
# Analizza i dettagli del prodotto selezionato
selettore_prodotto = selettore(testo=prodotto)
title = product_selector.css("h3 a::attr(title)").get()
prezzo = product_selector.css("p.price_color::text").get()
disponibilità = product_selector.css("p.instock.availability::text").get().strip()
print("Titolo:", titolo)
print("Prezzo:", prezzo)
print("Disponibilità:", disponibilità)
Spiegazione del copione:
GET
al sito web di esempio per recuperarne il contenuto HTML.articolo.prodotto_pod
per selezionare la prima voce del libro dalla pagina.prodotto_pod
blocco.Titolo: Una luce in soffitta
Prezzo: £51.77
Disponibilità: In magazzino
Parsel consente di estrarre facilmente il testo dagli elementi HTML, sia che si tratti di un titolo, di una descrizione o di altri contenuti visibili di una pagina web.
Per dimostrarlo, utilizzeremo lo stesso sito web di esempio di nuovo. Ci concentreremo sull'estrazione del testo del titolo di un singolo libro utilizzando il metodo h3
annidato all'interno di un elemento articolo con la classe prodotto_pod
.
Di seguito è riportato un esempio della sua struttura HTML:
Da questo elemento estrarremo:
importare richieste
da parsel import Selector
# Recupera la pagina web
url = "https://books.toscrape.com/"
risposta = requests.get(url)
selettore = Selettore(response.text)
# Selezionare il primo prodotto per classe
prodotto = selector.css("article.product_pod").get()
# Analizza il testo del titolo del prodotto selezionato
selettore_prodotto = selettore(testo=prodotto)
title_text = product_selector.css("h3 a::attr(title)").get()
print("Testo del titolo:", title_text)
GET
per recuperare il contenuto HTML dal sito web.prodotto_pod
Il selettore CSS si rivolge alla prima voce del libro.h3 a::attr(titolo)
lo script estrae l'attributo title dall'oggetto <a>
annidato nel tag <h3>
tag.Titolo del testo: Una luce in soffitta
Parsel ci permette anche di estrarre i valori degli attributi, come href, src o alt, dagli elementi HTML. Questi attributi spesso contengono dati preziosi come URL, fonti di immagini o testo descrittivo.
Ci concentreremo sull'estrazione del collegamento (href
) alla pagina di dettaglio di un libro dalla sezione <a>
all'interno di un tag articolo
con la classe prodotto_pod
.
Di seguito è riportato un esempio della sua struttura HTML:
Da questo elemento estrarremo:
href
) alla pagina di dettaglio del libroimportare richieste
da parsel import Selector
# Recupera la pagina web
url = "https://books.toscrape.com/"
risposta = requests.get(url)
selettore = Selettore(response.text)
# Selezionare il primo prodotto per classe
prodotto = selector.css("article.product_pod").get()
# Analizza l'attributo 'href' del prodotto selezionato
selettore_prodotto = selettore(text=prodotto)
book_link = product_selector.css("h3 a::attr(href)").get()
print("Link al libro:", book_link)
Spiegazione del copione:
Link al libro: catalogue/a-light-in-the-attic_1000/index.html
Parsel semplifica l'estrazione di più elementi da una pagina web utilizzando selettori CSS o XPath. Ciò è particolarmente utile quando si lavora con elenchi, come titoli di prodotti, link o prezzi.
Ci concentreremo sull'estrazione di un elenco di tutti i titoli di libri visualizzati nella homepage del sito web di esempio che stiamo utilizzando per questa esercitazione.
Di seguito è riportato un esempio della struttura HTML pertinente:
Da questi elementi estrarremo:
importare richieste
da parsel import Selector
# Recupera la pagina web
url = "https://books.toscrape.com/"
risposta = requests.get(url)
selettore = selettore(response.text)
# Selezionare tutti i titoli dei libri
titoli_libri = selector.css("article.product_pod h3 a::attr(title)").getall()
# Stampare ogni titolo
per titolo in titoli_di_libro:
print("Titolo:", titolo)
Spiegazione del copione:
GET
per recuperare il contenuto HTML dal sito web. article.product_pod h3 a::attr(title)
, seleziona tutti <a>
tag all'interno <h3>
tag all'interno prodotto_pod
elementi..getall()
recupera un elenco di tutti i titoli corrispondenti.Titolo: Una luce in soffitta
Titolo: Il velluto in testa
Titolo: Soumission
Titolo: Sharp Objects Sharp Objects
Parsel consente di navigare in modo efficiente in strutture HTML complesse e annidate, utilizzando i selettori CSS e XPath. Ciò è particolarmente utile per estrarre dati sepolti in profondità all'interno di più livelli di tag HTML.
Estrarremo il prezzo di un libro dall'interno del sito di prodotto_pod
elemento.
Di seguito è riportato un esempio della struttura HTML pertinente:
Da questa struttura annidata, estrarremo:
importare richieste
da parsel import Selector
# Recupera la pagina web
url = "https://books.toscrape.com/"
risposta = requests.get(url)
selettore = Selettore(response.text)
# Selezionare il primo prodotto per classe
prodotto = selector.css("article.product_pod").get()
# Analizzare l'elemento prezzo annidato
product_selector = selettore(text=product)
prezzo = product_selector.css("div.product_price p.price_color::text").get()
print("Prezzo:", prezzo)
Spiegazione del copione:
prodotto_pod
.div.prezzo_prodotto p.prezzo_colore
, naviga all'interno del div e seleziona l'elemento p
contenente il prezzo..get()
recupera il valore del prezzo.Prezzo: € 51,77
Parsel semplifica il processo di estrazione di dati strutturati da elenchi e tabelle HTML. I siti web spesso visualizzano le informazioni secondo schemi ripetuti, come griglie di prodotti o elenchi ordinati, rendendo Parsel uno strumento essenziale per catturare in modo efficiente questi dati.
A titolo di esempio, lavoreremo ancora con lo stesso sito web di esempio. Il nostro obiettivo è estrarre un elenco di titoli di libri con i relativi prezzi. In particolare, ci rivolgeremo al <ol>
che contiene più tag <li>
elementi, ognuno dei quali rappresenta un singolo libro.
Di seguito è riportato un esempio della struttura HTML pertinente:
Da questa struttura estrarremo:
import requests
from parsel import Selector
# Fetch the webpage
url = "https://books.toscrape.com/"
response = requests.get(url)
selector = Selector(response.text)
# Select all book items in the list
books = selector.css("ol.row li.article")
# Loop through each book and extract title and price
for book in books:
title = book.css("h3 a::attr(title)").get()
price = book.css("p.price_color::text").get()
print(f"Title: {title} | Price: {price}")
ol.row
li.articolo
tutti gli obiettivi <li> all'interno dell'elenco ordinato (<ol>), che rappresentano singoli elementi del libro.h3 a::attr(titolo)
estrae l'attributo title dell'oggetto <a>
tag. --- p.prezzo_colore::testo
estrae il testo del prezzo dal file <p>
tag.Titolo: A Luce in la soffitta | Prezzo: £51.77
Titolo: Ribaltamento il Velluto | Prezzo: £53.74
Titolo: Soumission | Prezzo: £50.10
Titolo: Sharp Oggetti | Prezzo: £47.82
...
In questa esercitazione abbiamo esplorato i fondamenti del parsing del web in Python con Parsel. Dalla comprensione dei selettori di base alla navigazione di elementi annidati, all'estrazione di attributi e al parsing di elenchi, abbiamo dimostrato come Parsel semplifichi il processo di estrazione di dati significativi dalle pagine web.
Ecco un breve riepilogo di ciò che abbiamo trattato:
Parsel è un potente strumento del kit di strumenti per lo scraping del web e la sua padronanza apre innumerevoli opportunità per la raccolta e l'analisi dei dati.
Buon parsing!