Parsing dell’HTML con BeautifulSoup
find(), select(), selettori CSS ed estrazione di contenuti strutturati dall’HTML
Parsing dell’HTML con BeautifulSoup è una lezione AI Agents gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento AI Agents, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso AI Agents include 4 lezioni in totale.
Perché analizzare l'HTML negli agenti
Molte fonti di dati non sono API, ma pagine web. Quando un agente deve estrarre informazioni strutturate dall'HTML, deve analizzare il markup grezzo e trasformarlo in un albero navigabile.
BeautifulSoup (bs4) è la libreria Python standard per questo scopo. Trasforma l'HTML disordinato in un oggetto Python che è possibile interrogare facilmente.
Creare un oggetto BeautifulSoup
Passi l'HTML grezzo e il nome di un parser a BeautifulSoup(). Il parser 'html.parser' è integrato in Python e non richiede installazioni aggiuntive. Per analizzare più rapidamente pagine di grandi dimensioni, è disponibile 'lxml' tramite pip.
from bs4 import BeautifulSoup
import httpx
# Fetch HTML
response = httpx.get('https://example.com', timeout=10.0)
html = response.text
# Parse it
soup = BeautifulSoup(html, 'html.parser')
# Get the page title
print(soup.title.text) # 'Example Domain'find() — trovare un singolo elemento
soup.find(tag, attrs) restituisce il primo elemento corrispondente oppure None se non ne trova alcuno. È possibile cercare per nome del tag, classe, id o qualsiasi attributo.
Controlli sempre che il risultato non sia None prima di chiamare metodi su di esso.
from bs4 import BeautifulSoup
html = '<div class="content"><h1>Title</h1><p>Body text here.</p></div>'
soup = BeautifulSoup(html, 'html.parser')
# Find by tag + class
content_div = soup.find('div', class_='content')
if content_div:
heading = content_div.find('h1')
print(heading.text) # 'Title'
# Find by id
sidebar = soup.find('div', id='sidebar') # None if absentfind_all() — trovare più elementi
soup.find_all(tag) restituisce un elenco di tutti gli elementi corrispondenti. Lo iteri per estrarre dati da strutture ripetute, come elementi di un elenco, righe di una tabella o schede di articoli.
from bs4 import BeautifulSoup
html = '<ul><li>Apple</li><li>Banana</li><li>Cherry</li></ul>'
soup = BeautifulSoup(html, 'html.parser')
items = soup.find_all('li')
for item in items:
print(item.text) # Apple, Banana, Cherry
# Limit results
first_two = soup.find_all('li', limit=2)Selettori CSS con select()
soup.select('css selector') consente di utilizzare la familiare sintassi CSS. Spesso è più conciso rispetto a concatenare chiamate a find(), soprattutto per gli elementi annidati.
from bs4 import BeautifulSoup
html = '''
<table>
<tr><td class="name">Alice</td><td class="score">95</td></tr>
<tr><td class="name">Bob</td><td class="score">87</td></tr>
</table>
'''
soup = BeautifulSoup(html, 'html.parser')
# Select all td elements inside tr inside table
cells = soup.select('table tr td')
for cell in cells:
print(cell.text)
# Select only name cells
names = soup.select('td.name')
for n in names:
print(n.text) # Alice, BobEstrarre il testo con .text e .strip()
.text (o .get_text()) restituisce tutto il contenuto testuale all'interno di un elemento, inclusi i tag annidati. Utilizzi .strip() per rimuovere gli spazi bianchi iniziali e finali, spesso presenti nell'HTML.
from bs4 import BeautifulSoup
html = '<p> \n Price: <strong>$29.99</strong> \n </p>'
soup = BeautifulSoup(html, 'html.parser')
paragraph = soup.find('p')
# .text includes nested tag content
print(paragraph.text) # ' \n Price: $29.99 \n '
print(paragraph.text.strip()) # 'Price: $29.99'
# get_text with separator
print(paragraph.get_text(separator=' ', strip=True)) # 'Price: $29.99'Estrarre gli attributi con .get()
È possibile accedere agli attributi dei tag, come href, src e data-*, come se fossero elementi di un dizionario, utilizzando .get('attr_name'). In questo modo viene restituito None se l'attributo è assente.
from bs4 import BeautifulSoup
html = '''
<a href="https://example.com/page" data-id="42">Click here</a>
<img src="/images/logo.png" alt="Logo">
'''
soup = BeautifulSoup(html, 'html.parser')
link = soup.find('a')
print(link.get('href')) # 'https://example.com/page'
print(link.get('data-id')) # '42'
print(link.get('class')) # None (no class attribute)
img = soup.find('img')
print(img.get('src')) # '/images/logo.png'Navigare nell'albero di analisi
Gli elementi BeautifulSoup presentano relazioni di parentela, discendenza e adiacenza che è possibile attraversare. Utilizzi .parent, .children, .next_sibling e .previous_sibling per spostarsi intorno a un elemento trovato.
from bs4 import BeautifulSoup
html = '''
<div class="article">
<h2>Headline</h2>
<p>First paragraph.</p>
<p>Second paragraph.</p>
</div>
'''
soup = BeautifulSoup(html, 'html.parser')
h2 = soup.find('h2')
print(h2.text) # 'Headline'
print(h2.parent['class']) # ['article']
print(h2.next_sibling.next_sibling.text) # 'First paragraph.'Estrarre tutti i link da una pagina
Un'attività comune per un agente consiste nel raccogliere tutti i link di una pagina per eseguire ulteriori operazioni di crawling. Trovi tutti i tag <a> ed estragga i relativi attributi href, filtrando quelli vuoti.
from bs4 import BeautifulSoup
import httpx
def extract_links(url: str) -> list:
response = httpx.get(url, timeout=10.0)
soup = BeautifulSoup(response.text, 'html.parser')
links = []
for tag in soup.find_all('a'):
href = tag.get('href')
if href and href.startswith('http'):
links.append(href)
return links
# urls = extract_links('https://news.ycombinator.com')
# print(urls[:5])Gestire con affidabilità l'HTML non valido
L'HTML del mondo reale è spesso non valido: tag non chiusi, elementi non corrispondenti e problemi di codifica. Il parser di BeautifulSoup è tollerante e tenta di correggere automaticamente gli errori. Tuttavia, verifichi sempre che il valore non sia None quando accede a elementi annidati.
from bs4 import BeautifulSoup
# Broken HTML — missing closing tags
html = '<div><p>Hello <strong>World</div>'
soup = BeautifulSoup(html, 'html.parser')
# BS4 repairs the tree automatically
print(soup.prettify())
# <div><p>Hello <strong>World</strong></p></div>
# Safe chained access
price = soup.find('span', class_='price')
price_text = price.text.strip() if price else 'N/A'
print(price_text) # 'N/A'Strumento completo per lo scraping con un agente
Mettiamo tutto insieme: una funzione completa di scraping che un agente può chiamare come strumento. Recupera una pagina, la analizza e restituisce dati strutturati in un formato che l'agente può utilizzare per ragionare.
from bs4 import BeautifulSoup
import httpx
def scrape_article(url: str) -> dict:
response = httpx.get(url, headers={'User-Agent': 'MyAgent/1.0'}, timeout=10.0)
response.raise_for_status()
soup = BeautifulSoup(response.text, 'html.parser')
title = soup.find('h1')
paragraphs = soup.find_all('p')
return {
'url': url,
'title': title.text.strip() if title else '',
'text': ' '.join(p.text.strip() for p in paragraphs[:5]),
'links': [a.get('href') for a in soup.find_all('a', href=True)][:10]
}Verifica delle conoscenze: BeautifulSoup
Verifichi la Sua comprensione dell'analisi dell'HTML con BeautifulSoup.
Riepilogo: analisi dell'HTML con BeautifulSoup
Ora può estrarre dati strutturati dalle pagine HTML all'interno dei Suoi agenti:
- Crei un oggetto soup con
BeautifulSoup(html, 'html.parser') - Usi
find()per un singolo elemento efind_all()per più elementi - Usi
select()per le query con selettori CSS - Ottenga il testo con
.text.strip()e gli attributi con.get('attr') - Navighi nell'albero con
.parent,.childrene i nodi fratelli
In combinazione con un client HTTP, BeautifulSoup consente al Suo agente di leggere qualsiasi pagina web.
Domande Frequenti
La lezione «Parsing dell’HTML con BeautifulSoup» è gratuita?
Sì — il testo completo di «Parsing dell’HTML con BeautifulSoup» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso AI Agents, passa a CoddyKit PRO. Il corso AI Agents include 4 lezioni in totale.
Cosa imparerò in «Parsing dell’HTML con BeautifulSoup»?
find(), select(), selettori CSS ed estrazione di contenuti strutturati dall’HTML Eserciti AI Agents con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare AI Agents?
Non è richiesta alcuna esperienza precedente. AI Agents su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.
Quanto tempo richiede la lezione «Parsing dell’HTML con BeautifulSoup»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione AI Agents?
Sì. Ogni lezione AI Agents include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Client HTTP per agenti: httpx e requests
- Parsing dell’HTML con BeautifulSoup
- Gestione della paginazione e dei contenuti dinamici
- Pratiche di scraping responsabile