1. Perché usare find
e find_all
?
Oggi parliamo di due metodi principali che ci permettono di estrarre in modo mirato ed efficace gli elementi dai documenti HTML: find
e find_all
.
Prima di tuffarci nel codice, discutiamo perché questi metodi sono necessari. Immagina una pagina web come una grande biblioteca, dove ogni parola e frase è un elemento HTML. Sembra quasi che trovare le informazioni richieste sia come cercare di indovinare il gusto di un gelato senza conoscerne il colore. I metodi find
e find_all
sono i tuoi "rilevatori di gusto" che ti aiutano a sintonizzarti sulle informazioni necessarie.
find
: Questo metodo è come la routine di un programmatore che cerca rapidamente la prima tazza di caffè del mattino: trova e restituisce velocemente il primo elemento che soddisfa i criteri.find_all
: Questo è un approccio più paziente e approfondito, restituisce una lista di tutti gli elementi che soddisfano i criteri di ricerca. È utile quando hai bisogno di più informazioni (per esempio, come avere diverse tazze di caffè durante la giornata).
2. Utilizzo del metodo find
Il metodo find
può essere usato quando vuoi rapidamente estrarre il primo elemento adatto. Riceve vari parametri, come il nome del tag, attributi e persino funzioni.
Firma del metodo find
find(name=None, attrs={}, recursive=True, string=None, **kwargs)
Parametri del metodo find
- name: Nome del tag che vuoi trovare. Può essere qualsiasi tag HTML, ad esempio,
div
,p
,h1
,a
ecc. - attrs: Dizionario di attributi del tag. Ad esempio,
{'class': 'example'}
o{'id': 'main'}
. Questo parametro consente di restringere la ricerca. - recursive: Un parametro booleano che determina se il metodo cercherà il tag a tutti i livelli
di annidamento.
Di default è
True
, il che significa che la ricerca verrà effettuata su tutti i livelli. - string: Cerca gli elementi con un testo specifico. Utile per filtrare elementi in base al contenuto del testo.
- kwargs: Argomenti aggiuntivi per la ricerca basati sugli attributi. Se specificati argomenti come
class_
, saranno interpretati comeattrs={'class': 'valore'}
.
Esempio
from bs4 import BeautifulSoup
html_doc = """
<html>
<head><title>La storia del Dormouse</title></head>
<body>
<p class="title"><b>La storia del Dormouse</b></p>
<p class="story">C'era una volta tre piccole sorelle; e i loro nomi erano
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> e
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
e vivevano in fondo a un pozzo.</p>
</body>
</html>
"""
soup = BeautifulSoup(html_doc, 'html.parser')
first_link = soup.find('a') # Trova il primo tag <a>
print(first_link) # Stampa: <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>
Come puoi vedere, il metodo find
ha trovato il primo tag <a>
nel documento, e possiamo continuare la nostra ricerca sapendo che le informazioni richieste sono state trovate.
3. Utilizzo del metodo find_all
Il metodo find_all
restituisce una lista di tutti gli elementi che corrispondono ai criteri specificati. Questo è particolarmente utile quando devi ottenere tutti i tag di un certo tipo o tutti gli elementi con una specifica classe.
Firma del metodo find_all
find_all(name=None, attrs={}, recursive=True, string=None, limit=None, **kwargs)
Parametri del metodo find_all
- name: Nome del tag che vuoi trovare. Può essere una stringa contenente il nome del tag
(
div
,a
,p
ecc.) oppure una lista di tag, ad esempio,["div", "p"]
. - attrs: Dizionario di attributi per filtrare i tag, ad esempio,
{'class': 'example'}
. - recursive: Determina se la ricerca sarà ricorsiva, includendo i tag annidati. Valore predefinito
True
. - string: Cerca tag contenenti un testo specifico.
- limit: Imposta il numero massimo di risultati da restituire. Se specificato, il metodo restituirà al massimo
limit
elementi. - kwargs: Parametri aggiuntivi per filtrare gli attributi del tag.
Esempio di utilizzo di find_all
Se find
è come una ricerca veloce del libro giusto sugli scaffali, find_all
è un approccio più dettagliato, come se stessi leggendo ogni intestazione della sezione per capire meglio.
all_links = soup.find_all('a') # Trova tutti i tag <a>
for link in all_links:
print(link.get('href')) # Stampa i link: http://example.com/elsie, http://example.com/lacie, http://example.com/tillie
In questo esempio troviamo tutti i tag <a>
e quindi estraiamo i collegamenti da ciascuno di essi. Utile se devi raccogliere tutti i link su una pagina.
Importante! I metodi find()
e find_all()
possono essere chiamati non solo sull'oggetto soup, ma su qualsiasi elemento figlio restituito da funzioni come find()
, select()
ecc.
4. Uso degli attributi per filtrare gli elementi
Ora che abbiamo il controllo sulla nostra sete di dati, è il momento di essere più specifici. I metodi
find
e find_all
consentono di filtrare gli elementi in base agli attributi. È come impostare un filtro sulla macchina del caffè per ottenere proprio quella bevanda che desideri.
link_with_id = soup.find('a', id='link2') # Trova il tag <a> con id='link2'
print(link_with_id.text) # Stampa: Lacie
Usando il parametro id
, abbiamo trovato rapidamente l'elemento richiesto. Allo stesso modo, si possono usare altri attributi, come class
.
links_with_class = soup.find_all('a', class_='sister') # Trova tutti i tag <a> con class='sister'
for link in links_with_class:
print(link.get('id')) # Stampa: link1, link2, link3
GO TO FULL VERSION