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.

  1. from urllib.request import urlopen
  2. from bs4 import BeautifulSoup
  3. html = urlopen("/seo/web-scraping")
  4. Obj = BeautifulSoup(html.read())
  5. tag = Obj.findAll("h2")
  6. for i in tag:
  7. 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.

 


 

Segnalami un errore, un refuso o un suggerimento per migliorare gli appunti

FacebookTwitterLinkedinLinkedin
knowledge base
  1. Il linguaggio Python
  2. Come installare Python sul PC
  3. Come scrivere un programma in Python
  4. Come usare Python in modalità interattiva
  5. Le variabili
  6. I numeri
  7. Gli operatori logici
  8. Le strutture iterative ( o cicli )
  9. Le strutture condizionali
  10. Le eccezioni
  11. I file in python
  12. Le classi
  13. I moduli