Introduzione al parsing del web in Python con Parsel

Pitone, Gennaio-03-20255 minuti di lettura

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.

Introduzione a Parsel

Che cos'è il web parsing e perché è importante?

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.

Caratteristiche principali di Parsel

  • Supporto dei selettori: Utilizzate XPath per una navigazione dettagliata dei percorsi o i selettori CSS per una sintassi più semplice.
  • Flessibilità: Supporta molteplici attività di parsing HTML/XML, dalla semplice estrazione del testo alla gestione di elementi annidati in profondità.
  • Scalabilità: Parsel può estrarre dati da una singola pagina o da più pagine tramite strutture ad anello.
  • Integrazione con Scrapy: La compatibilità di Parsel si estende naturalmente a Scrapy, un popolare framework per lo scraping del web.

Casi d'uso comuni

  • Web Scraping: Estrazione di dati da siti web di e-commerce per il monitoraggio dei prezzi.
  • Data Mining: Raccolta di informazioni di contatto o di dati di ricerca da documenti pubblici.
  • Automazione: Semplificare le attività ripetitive come il download delle specifiche dei prodotti.

Capire i selettori e il parsing HTML

Che cos'è il parsing HTML?

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:

  • Tag: Definire il tipo di elemento (ad es., <h1>, <p>, <img>).
  • Attributi: Fornire informazioni aggiuntive su un elemento (ad es, id, classe, href).
  • DOM: Rappresentazione gerarchica della pagina web, che consente la navigazione tra gli elementi.

Cosa sono i selezionatori?

I selettori XPath e CSS sono linguaggi di interrogazione utilizzati per selezionare elementi in un documento HTML:

  • XPath: Potente e ricco di funzioni, XPath consente di selezionare i nodi in base al loro percorso nel DOM, alle relazioni genitore-figlio e alle condizioni.
  • Selettori CSS: Una sintassi più semplice spesso utilizzata nello sviluppo front-end, ideale per selezionare elementi basati su classi, ID o pseudo-selettori.

Ulteriori informazioni sui selezionatori sono disponibili qui.

Prerequisiti

Prima di iniziare a utilizzare Parsel, accertatevi di quanto segue:

  • Python installato: Scaricare e installare Python da
  • Installare le librerie necessarie(parsel, requests): 
pip installa le richieste di parsel

Tecniche di parselling per il parsing dell'HTML

Estrazione di elementi per ID e classe

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_podche rappresenta una singola voce del libro.

Di seguito è riportato un esempio della sua struttura HTML:

Da questo elemento estrarremo:

  • Titolo del libro
  • Prezzo del libro
  • Stato di disponibilità

Esempio di codice Python

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:

  • Recuperare la pagina web: Lo script invia un messaggio GET al sito web di esempio per recuperarne il contenuto HTML.
  • Selezionare il blocco prodotto: Utilizza il selettore CSS articolo.prodotto_pod per selezionare la prima voce del libro dalla pagina.
  • Analizzare i dettagli del prodotto: Lo script estrae il file titolo, prezzo, e disponibilità mirando a specifici tag e attributi HTML all'interno del sito. prodotto_pod blocco.
  • Visualizzare i risultati: I dati estratti vengono stampati sulla console in un formato leggibile.

Esempio di uscita

Titolo: Una luce in soffitta
Prezzo: £51.77
Disponibilità: In magazzino

Estrazione del testo dagli elementi

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:

  • Il testo del titolo del libro

Esempio di codice Python

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)

Spiegazione del copione:

  • Recuperare la pagina web: Lo script invia un messaggio GET per recuperare il contenuto HTML dal sito web.
  • Selezionare il blocco prodotto: L'articolo.prodotto_pod Il selettore CSS si rivolge alla prima voce del libro.
  • Estrarre il testo del titolo: Utilizzo h3 a::attr(titolo)lo script estrae l'attributo title dall'oggetto <a> annidato nel tag <h3> tag.
  • Visualizza il risultato: Il titolo estratto viene stampato sulla console.

Esempio di uscita

Titolo del testo: Una luce in soffitta

Estrazione di attributi (ad esempio, `href`, `src`, `alt`)

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:

  • Il link (href) alla pagina di dettaglio del libro

Esempio di codice Python

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 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:

  • Recuperare la pagina web: Lo script invia una richiesta GET per recuperare il contenuto HTML dal sito web.
  • Selezionare il blocco prodotto: Il selettore CSS article.product_pod si rivolge alla prima voce del libro.
  • Estrarre l'attributo href: Utilizzando h3 a::attr(href), lo script estrae il valore href dal tag annidato nel tag.
  • Visualizzare il risultato: L'URL estratto viene stampato nella console.

Esempio di uscita

Link al libro: catalogue/a-light-in-the-attic_1000/index.html

Estrazione di elenchi di elementi

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:

  • I titoli di tutti i libri visualizzati nella homepage

Esempio di codice Python

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:

  • Recuperare la pagina web: Lo script invia un messaggio GET per recuperare il contenuto HTML dal sito web.
  • Selezionare tutti i titoli: Utilizzando il CSS selettore article.product_pod h3 a::attr(title), seleziona tutti <a> tag all'interno <h3> tag all'interno prodotto_pod elementi.
  • Titoli dell'estratto: Il .getall() recupera un elenco di tutti i titoli corrispondenti.
  • Visualizzazione dei risultati: Ogni titolo dell'elenco viene stampato uno per uno.

Esempio di uscita

Titolo: Una luce in soffitta
Titolo: Il velluto in testa
Titolo: Soumission
Titolo: Sharp Objects Sharp Objects

Navigazione tra gli elementi annidati

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:

  • Il prezzo del primo libro

Esempio di codice Python

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:

  • Recuperare la pagina web: Lo script recupera il contenuto HTML della pagina web utilizzando le richieste.
  • Selezionare il primo blocco di prodotti: Si rivolge al primo tag dell'articolo con la classe prodotto_pod.
  • Navigare fino all'elemento prezzo annidato: Utilizzando il CSS selettore div.prezzo_prodotto p.prezzo_colore, naviga all'interno del div e seleziona l'elemento p contenente il prezzo.
  • Estrarre il testo del prezzo: Il .get() recupera il valore del prezzo.
  • Visualizzare il risultato: Viene stampato il prezzo estratto.

Esempio di uscita

Prezzo: € 51,77

Parsing di tabelle ed elenchi

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:

  • Il titolo di ogni libro
  • Il prezzo di ogni libro

Esempio di codice Python

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}")

Spiegazione del copione:

  • Recuperare la pagina web: Lo script invia una richiesta GET per recuperare il contenuto HTML dal sito web.
  • Selezionare tutti gli articoli del libro: Il selettore ol.row li.articolo tutti gli obiettivi <li> all'interno dell'elenco ordinato (<ol>), che rappresentano singoli elementi del libro.
  • Estrarre titolo e prezzo: 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.
  • Visualizzare i risultati: Lo script stampa il titolo e il prezzo di ciascun libro.

Esempio di uscita

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
...

Conclusione

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:

  • Estrazione di elementi per ID e classe: Individuazione di elementi HTML specifici mediante selettori CSS.
  • Estrazione di testo e attributi: Imparare a estrarre dagli elementi il contenuto testuale e gli attributi come href e src.
  • Gestire gli elementi annidati: Esplorare come navigare attraverso le relazioni genitore-figlio nelle strutture HTML.
  • Parsing di elenchi: Estrazione di dati strutturati da schemi ripetuti, come tabelle o elenchi di prodotti.

Prossimi passi:

  • Sperimentate diverse pagine web e strutture HTML complesse con Parsel.
  • Esplorare l'integrazione con altre librerie come Scrapy per progetti di scraping web su larga scala.
  • Seguire le migliori pratiche di scraping etico, come il rispetto dei file robots.txt e l'evitare di sovraccaricare i server.

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!