1. Estrazione di dati tabulari
Cosa hanno in comune le tabelle e le cipolle? Sì, sì, gli strati!
Le tabelle in HTML sono una sorta di equivalente di un millefoglie,
che è composto da elementi
<table>
,
<tr>
(righe),
<th>
(celle di intestazione) e
<td>
(celle comuni). Ognuno di questi
elementi ha un ruolo nella rappresentazione dei dati e, per
estrarre le informazioni, dobbiamo accedere a ogni strato uno alla volta.
Pratica, pratica e ancora pratica!
Iniziamo con la seguente semplice tabella HTML:
<table>
<tr>
<th>Nome</th>
<th>Età</th>
<th>Città</th>
</tr>
<tr>
<td>Alice</td>
<td>29</td>
<td>Mosca</td>
</tr>
<tr>
<td>Bob</td>
<td>34</td>
<td>San Pietroburgo</td>
</tr>
</table>
Passo 1: Trovare una tabella nella pagina
Le tabelle nelle pagine web sono definite dai tag HTML
<table>
, e i dati all'interno delle tabelle
si trovano dentro i tag <tr>
(righe della
tabella) e <td>
(celle di dati). In
BeautifulSoup
il metodo find
aiuta a trovare la
prima tabella sulla pagina, mentre find_all
consente di ottenere tutte le tabelle, se ce ne sono diverse.
# Trovare la prima tabella sulla pagina
table = soup.find("table")
Se è necessario estrarre una specifica tabella, possiamo
affinare la ricerca, specificando gli attributi della tabella, ad esempio, id
o
class
.
# Trovare una tabella per classe
table = soup.find("table", {"class": "table-class"})
Passo 2: Estrazione dei dati dalla tabella
Dopo il caricamento, possiamo procedere con l'estrazione dei dati. I dati nella tabella sono disposti per righe, quindi il passo logico sarà scorrere le righe della tabella ed estrarre i dati da ogni cella.
Estrazione delle intestazioni
Le intestazioni della tabella di solito si trovano nella prima riga e
sono racchiuse nei tag <th>
. Usare
find_all
permette di raccogliere tutte le intestazioni in
una lista.
# Estrarre le intestazioni dalla prima riga della tabella
headers = []
header_row = table.find("tr")
for th in header_row.find_all("th"):
headers.append(th.text.strip())
print("Intestazioni della tabella:", headers)
Estrazione delle righe di dati
Per estrarre tutte le righe dei dati (di solito racchiuse nei tag
<tr>
, e ogni cella — in
<td>
) utilizziamo un ciclo nidificato: prima
troviamo tutte le righe <tr>
, quindi
scansioniamo le celle <td>
in ogni
riga.
# Estrarre tutte le righe di dati
data = []
rows = table.find_all("tr")[1:] # Saltare la prima riga con le intestazioni
for row in rows:
row_data = []
for cell in row.find_all("td"):
row_data.append(cell.text.strip())
data.append(row_data)
print("Dati della tabella:", data)
Questo codice scorre ordinatamente le righe della tabella e estrae il testo da ogni cella. Non è fantastico? Ovviamente tutti sappiamo che non ci sono magie senza i cicli!
2. Lavorare con le liste
Le liste — fratelli maggiori delle tabelle
Nella vita, ci sono solo due oggetti infiniti: tabelle e liste.
Le liste sono rappresentate dagli elementi
<ul>
(non numerate) e
<ol>
(numerate), e i loro elementi
sono <li>
. A differenza delle tabelle,
le liste sono semplici e minimaliste. Questo le rende ideali
per un'elaborazione rapida ed efficace dei dati!
Estrazione di dati dalle liste
Guardiamo un esempio di lista HTML:
<ul>
<li>Mela</li>
<li>Banana</li>
<li>Uva</li>
</ul>
Ora usiamo il nostro caro BeautifulSoup
, per
estrarre questi dati:
html = """
<ul>
<li>Mela</li>
<li>Banana</li>
<li>Uva</li>
</ul>
"""
soup = BeautifulSoup(html, 'html.parser')
ul = soup.find('ul')
items = ul.find_all('li')
for item in items:
print(item.get_text())
Ecco fatto! Un approccio semplice, ma efficace, che puoi applicare a strutture più complesse.
3. Esempio di estrazione e elaborazione di dati tabulari
Per consolidare le conoscenze, proviamo a estrarre dati da un esempio pratico simile, ma con una struttura più complessa:
<table id="courses">
<tr>
<th>Corso</th>
<th>Istruttore</th>
</tr>
<tr>
<td>Python per tutti</td>
<td>Guido van Rossum</td>
</tr>
<tr>
<td>Automazione con Python</td>
<td>Eric Matthes</td>
</tr>
</table>
<ul class="technologies">
<li>Python</li>
<li>JavaScript</li>
<li>HTML & CSS</li>
</ul>
Per estrarre i dati dalla tabella e dalla lista, possiamo impostare le query in questo modo:
html = """
<table id="courses">
<tr>
<th>Corso</th>
<th>Istruttore</th>
</tr>
<tr>
<td>Python per tutti</td>
<td>Guido van Rossum</td>
</tr>
<tr>
<td>Automazione con Python</td>
<td>Eric Matthes</td>
</tr>
</table>
<ul class="technologies">
<li>Python</li>
<li>JavaScript</li>
<li>HTML & CSS</li>
</ul>
"""
soup = BeautifulSoup(html, 'html.parser')
# Estrazione di dati dalla tabella
course_table = soup.find('table', id='courses')
course_rows = course_table.find_all('tr')
for row in course_rows:
cells = row.find_all(['th', 'td'])
for cell in cells:
print(cell.get_text())
print("---")
# Estrazione di dati dalla lista
tech_list = soup.find('ul', class_='technologies')
tech_items = tech_list.find_all('li')
for item in tech_items:
print(item.get_text())
Questo script copre entrambi i tipi di dati. Nota come utilizziamo id e classi per una ricerca precisa dei tag. Nella pratica potresti trovarti di fronte a strutture HTML più complesse, ma il procedimento rimane lo stesso: iniziamo dai livelli più alti, analizziamo gli elementi e, infine, estraiamo i dati preziosi!
4. Conclusione parziale ed errori comuni
Lavorare con tabelle e liste nelle pagine web è come navigare in un labirinto. A volte possiamo incontrare dati imperfetti, come celle vuote o elementi mancanti. In questi casi, è importante verificare che i dati siano corretti e completi. Gli errori comuni possono includere tentativi di accedere a elementi inesistenti o uso errato dei selettori. È importante ricordare che l'HTML potrebbe non essere pulito e strutturato come ci piacerebbe, quindi conviene sempre considerare il trattamento delle eccezioni e la verifica della validità dei dati.
Dove può essere utile?
Le conoscenze acquisite in questa lezione ti aiuteranno a estrarre ed elaborare automaticamente i dati da molte fonti online. Puoi, ad esempio, automatizzare la raccolta dai dati di scambio, configurare un monitoraggio dei prezzi nei negozi online e persino eseguire un'analisi regolare dei dati da blog e siti di notizie. La padronanza delle tecniche di estrazione dei dati da tabelle e liste apre un mondo di possibilità per l'automazione e l'analisi dei dati.
GO TO FULL VERSION