1. Navigazione nell'albero HTML
Oggi ci immergeremo nel mondo misterioso degli alberi HTML e
impareremo a estrarre informazioni dalle pagine web come veri
ninja della programmazione. Continueremo a usare la magica libreria
BeautifulSoup
per raggiungere i dati di cui abbiamo bisogno e
arricchire i nostri script già molto intelligenti con ancora più
funzionalità. Quindi, prepara la tua tastiera e
iniziamo!
Allora, prima di iniziare a estrarre dati, vediamo di capire ancora una volta cos'è un albero HTML. Immaginalo come un enorme albero genealogico, dove ogni tag è un parente separato. Ci sono genitori, figli, fratelli e sorelle. Il nostro compito è trovare i "parenti" specifici per estrarre accuratamente preziose reliquie di famiglia (o, dati).
Ecco come potrebbe apparire un frammento HTML:
<div class="article">
<h2 id="title">Titolo</h2>
<p class="content">Questo è il testo dell'articolo...</p>
<a href="https://example.com" class="link">Leggi di più</a>
</div>
Qui abbiamo un div
, che è l'elemento
genitore per h2
, p
,
e a
. Ognuno di essi ha i propri attributi e
contenuto.
2. Estrazione dei dati per tag
BeautifulSoup
offre metodi comodi per navigare nell'albero e
estrarre dati. Iniziamo con il metodo base
find()
, che ci permette di trovare
il primo elemento con un determinato tag. E poi
find_all()
- è come una scavatrice di ricerca,
che scava tutti gli elementi con il tag specificato.
from bs4 import BeautifulSoup
html_doc = """<div class="article">
<h2 id="title">Titolo</h2>
<p class="content">Questo è il testo dell'articolo...</p>
<a href="https://example.com" class="link">Leggi di più</a>
</div>"""
soup = BeautifulSoup(html_doc, 'html.parser')
# Troviamo il primo paragrafo
first_paragraph = soup.find('p')
print(first_paragraph.text) # Output: Questo è il testo dell'articolo...
# Troviamo tutti i link
all_links = soup.find_all('a')
for link in all_links:
print(link['href']) # Output: https://example.com
3. Uso degli attributi per filtrare gli elementi
Ora che abbiamo imparato a cercare per tag, è il momento di scoprire come
filtrare gli elementi utilizzando attributi come
id
e class
. Questi attributi sono come
segnalibri su una pagina, che mostrano subito cosa è cosa.
<div class="article">
<h2 id="title">Titolo</h2>
<p class="content">Questo è il testo dell'articolo...</p>
<a href="https://example.com" class="link">Leggi di più</a>
</div>
# Troviamo un elemento con un certo id
title = soup.find(id="title")
print(title.text) # Output: Titolo
# Troviamo tutti gli elementi con la classe "content"
content_paragraphs = soup.find_all(class_="content")
for p in content_paragraphs:
print(p.text) # Output: Questo è il testo dell'articolo...
Importante! Usiamo class_
invece di
class
— è per evitare conflitti con
parole riservate in Python.
4. Pratica di estrazione di dati con condizioni specifiche
E ora passiamo alla pratica! Immagina di dover estrarre link e testi di titoli da un grande array HTML ripetitivo di articoli. Ecco un esempio di dati e come lavorarci:
<div class="articles">
<div class="article">
<h2 class="title">Primo articolo</h2>
<a href="https://example.com/1" class="read-more">Leggi di più</a>
</div>
<div class="article">
<h2 class="title">Secondo articolo</h2>
<a href="https://example.com/2" class="read-more">Leggi di più</a>
</div>
</div>
Ecco come possiamo estrarre titoli e link:
html_doc = """<div class="articles">
<div class="article">
<h2 class="title">Primo articolo</h2>
<a href="https://example.com/1" class="read-more">Leggi di più</a>
</div>
<div class="article">
<h2 class="title">Secondo articolo</h2>
<a href="https://example.com/2" class="read-more">Leggi di più</a>
</div>
</div>"""
soup = BeautifulSoup(html_doc, 'html.parser')
articles = soup.find_all('div', class_='article')
for article in articles:
title = article.find('h2', class_='title').text
link = article.find('a', class_='read-more')['href']
print(f"Titolo: {title}, Link: {link}")
# Output:
# Titolo: Primo articolo, Link: https://example.com/1
# Titolo: Secondo articolo, Link: https://example.com/2
5. Occhio agli errori
Ora che sei armato di conoscenze, diamo un'occhiata a
alcuni errori tipici. Uno dei problemi più comuni è il tentativo
di accedere a un attributo che non
esiste. In questo caso Python risponde con un simpatico ma comunque fastidioso
KeyError
. Per evitare
ciò, puoi usare il metodo .get()
per
ottenere attributi con un valore predefinito, se assenti.
Inoltre, non dimenticare gli elementi HTML che possono
essere nidificati e avere una struttura complessa. Usa
lo strumento per ispezionare il codice sorgente della pagina nel browser
per assicurarti di capire correttamente la struttura
prima di cercare di estrarre i dati con BeautifulSoup
.
La prossima tappa del nostro emozionante viaggio
sarà l'applicazione dei selettori CSS per mirare ancora più precisamente e
estrarre informazioni. Quindi resta con noi,
perché le avventure nel mondo di BeautifulSoup
sono appena cominciate!
GO TO FULL VERSION