CodeGym /Corso Java /Python SELF IT /Estrazione dei dati in base ai tag e attributi HTML

Estrazione dei dati in base ai tag e attributi HTML

Python SELF IT
Livello 31 , Lezione 3
Disponibile

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:

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.

python
                      
                        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.

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>
Python

# 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:

HTML

<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:

Python

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!

Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION