La funzione findAll di BeautifulSoup in Python
La funzione findAll() del modulo BeautifulSoup mi permette di estrarre un tag html da un testo tramite il linguaggio Python.
nome.findAll(tag)
Dove il nome è l'oggetto che contiene il testo html, già formattato dalla funzione BeautifulSoup, mentre il tag è il tag html da estrarre dal testo.
Un esempio pratico
Ecco un esempio pratico di utilizzo della funzione findAll().
In questo codice la uso per estrarre i tag <H2> dal codice Html di una pagina web.
- from urllib.request import urlopen
- from bs4 import BeautifulSoup
- html = urlopen("/seo/web-scraping")
- Obj = BeautifulSoup(html.read())
- tag = Obj.findAll("h2")
- for i in tag:
- print(i)
L'output del programma è il seguente:
<h2>A cosa serve lo scraping</h2>
<h2>Gli aspetti legali del web scraping</h2>
<h2>Come fare scraping di un sito web</h2>
Il programma ha estrapolato in modo corretto tutti i tag <h2> presenti nella pagina web.
Per estrarre due tag contemporaneamente basta indicarli tra parentesi graffe separati da un virgola
tag = Obj.findAll({"h1","h2"})
Altri parametri della funzione
La funzione ha anche altri parametri facoltativi molto utili
1] Gli attributi del tag
Il secondo parametro mi permette di indicare un'eventuale attributo presente nel tag html.
nome.findAll(tag, attributi)
Ad esempio, posso indicare la classe dell'attributo
nome.findAll("h2", {"class":"titolo"})
In questo modo la funzione estrae solo i tag <H2> con la classe "titolo".
In alternativa, posso scrivere per esplicito l'attributo
nome.findAll("H2", attrs={"class":"titolo"})
Per selezionare due classi basta indicarle tra parentesi quadre separate da virgola.
nome.findAll("h2", {"class":["titolo","sottotitolo"]})
Infine, per selezionare due attributi diversi, li separo tramite una virgola dentro le parentesi graffe
nome.findAll("H2", attrs={"class":"titolo","align":"center"})
2] recursive
E' un argomento booleano. Se è True (vero) la ricerca continua anche all'interno dei tag interni (figli). Viceversa, se False si ferma al tag più alto (genitore). Di default è True.
nome.findAll("h2", {"class":"titolo"}, recursive=False)
3] text
Questo argomento mi permette di selezionare un tag in base al contenuto testuale presente al suo interno.
x=nome.findall(text="testo da cercare")
Con la funzione len() posso conoscere il numero dei tag che soddisfano la condizione.
x = nome.findAll("b", text="Nota")
print(len(x))
In quest'ultimo esempio seleziono tutti i tag <b> con il contenuto uguale a "Nota".
Poi stampo il numero dei tag selezionati.
4] limit
Questo argomento pone un limite ai risultati trovati dalla funzione findAll(). Ad esempio, settando limit=1 la funzione restituisce un solo risultato della ricerca.
nome.findAll("h2", {"class":"titolo"}, limit=2)
5] keywords
Permette di selezionare solo i tag che contengono un particolare attributo.
E così via.