0Pricing
R Academy · Lezione

Acquisizione di tabelle e link

Analizzi le tabelle HTML in data frame e raccolga tutti i collegamenti ipertestuali di una pagina.

Acquisizione di tabelle e link è una lezione R Academy gratuita su CoddyKit. Questa è la lezione 3 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 R Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso R Academy include 4 lezioni in totale.

Tabelle HTML nelle pagine web

Le tabelle HTML (<table>) sono gli obiettivi più pratici per lo scraping perché hanno già una struttura. html_table() di rvest le converte direttamente in data frame R, gestendo automaticamente le intestazioni.

library(rvest)
html <- read_html('
  <table>
    <thead><tr><th>Country</th><th>GDP</th><th>Pop</th></tr></thead>
    <tbody>
      <tr><td>USA</td><td>25T</td><td>330M</td></tr>
      <tr><td>China</td><td>18T</td><td>1400M</td></tr>
    </tbody>
  </table>
')
# html_table converts to data frame
tbl <- html_table(html_element(html, 'table'))
class(tbl)      # 'data.frame'
names(tbl)      # c('Country', 'GDP', 'Pop')
nrow(tbl)       # 2
print(tbl)

html_table() su una pagina completa

Quando una pagina contiene più tabelle, usi html_elements() (al plurale) per recuperarle tutte, quindi applichi html_table() al nodeset risultante per ottenere una lista di data frame. Selezioni quella necessaria tramite l'indice.

library(rvest)
html <- read_html('
  <table id="t1"><tr><th>A</th></tr><tr><td>1</td></tr></table>
  <table id="t2"><tr><th>X</th><th>Y</th></tr>
    <tr><td>10</td><td>20</td></tr></table>
')
# Get ALL tables as a list of data frames
tables <- html_table(html_elements(html, 'table'))
length(tables)  # 2

# First table
tables[[1]]

# Second table
tables[[2]]

# Select a specific table by its id
table2 <- html_table(html_element(html, '#t2'))
print(table2)

Pulizia dei dati delle tabelle

Le tabelle estratte dai siti web presentano spesso intestazioni disordinate, celle unite o spazi bianchi aggiuntivi. Usi janitor::clean_names() per le intestazioni e le operazioni standard di dplyr/stringr per pulire i valori delle celle.

library(rvest)
html <- read_html('
  <table>
    <tr><th>Product Name</th><th>Price (USD)</th><th>In Stock?</th></tr>
    <tr><td>  Widget A  </td><td>$12.50</td><td>Yes</td></tr>
    <tr><td>Gadget B</td><td>$7.99</td><td>No</td></tr>
  </table>
')
df <- html_table(html_element(html, 'table'))

# Clean column names
names(df) <- c('product', 'price', 'in_stock')

# Strip whitespace and dollar signs
df$product  <- trimws(df$product)
df$price    <- as.numeric(gsub('[$]', '', df$price))
df$in_stock <- df$in_stock == 'Yes'
print(df)

Estrazione di tutti i link in una pagina

I link sono tag anchor (<a>) con attributi href. Usi html_elements(page, 'a') per recuperare tutte le anchor, quindi html_attr('href') per gli URL e html_text2() per il testo dei link.

library(rvest)
html <- read_html('
  <div>
    <a href="/about">About Us</a>
    <a href="/products">Products</a>
    <a href="https://partner.com" rel="external">Partner</a>
    <a>No href link</a>
  </div>
')
# Get all anchor elements
anchors <- html_elements(html, 'a')

# Extract text and href
link_text <- html_text2(anchors)
link_href <- html_attr(anchors, 'href')

data.frame(text = link_text, href = link_href)
# Note: last row has NA href

Filtraggio dei link significativi

Le pagine reali contengono link di navigazione, link nel piè di pagina e ancore interne insieme ai link che desidera effettivamente ottenere. Applichi un filtro rimuovendo i valori NA, le ancore (#) e i link javascript:, quindi usi la ricerca per pattern per conservare solo gli URL pertinenti.

library(rvest)
html <- read_html('
  <div>
    <a href="/article/1">Article One</a>
    <a href="/article/2">Article Two</a>
    <a href="#top">Back to top</a>
    <a href="javascript:void(0)">JS link</a>
    <a href="/article/3">Article Three</a>
  </div>
')
anchors <- html_elements(html, 'a')
hrefs <- html_attr(anchors, 'href')
texts <- html_text2(anchors)

# Keep only article links
article_idx <- grepl('^/article/', hrefs) & !is.na(hrefs)
article_links <- data.frame(
  text = texts[article_idx],
  href = hrefs[article_idx]
)
print(article_links)

Da URL relativi ad assoluti

I valori href estratti sono spesso percorsi relativi come /page. Li trasformi in URL assoluti anteponendo l'URL di base. La funzione xml2::url_absolute() gestisce correttamente questa operazione.

library(rvest)
base_url <- 'https://books.toscrape.com'

html <- read_html('
  <ul>
    <li><a href="/catalogue/book1">Book One</a></li>
    <li><a href="/catalogue/book2">Book Two</a></li>
    <li><a href="https://external.com/book">External</a></li>
  </ul>
')
hrefs <- html_attr(html_elements(html, 'a'), 'href')

# xml2::url_absolute resolves relative + keeps absolute
abs_urls <- xml2::url_absolute(hrefs, base = base_url)
abs_urls
# 'https://books.toscrape.com/catalogue/book1'
# 'https://books.toscrape.com/catalogue/book2'
# 'https://external.com/book'  <- kept as-is

Estrazione mirata dei link

Anziché estrarre tutti i link e filtrarli, usi selettori CSS specifici per individuare solo i link necessari. Combini il contesto dell'elemento con i selettori degli attributi per ottenere maggiore precisione.

library(rvest)
html <- read_html('
  <nav class="breadcrumb">
    <a href="/">Home</a> > <a href="/books">Books</a>
  </nav>
  <ul class="products">
    <li><a href="/books/1" class="prod-link">Clean Code</a></li>
    <li><a href="/books/2" class="prod-link">Refactoring</a></li>
  </ul>
  <footer>
    <a href="/privacy">Privacy</a>
  </footer>
')
# Target ONLY product links (not nav or footer)
prod_links <- html_elements(html, 'ul.products a.prod-link')
data.frame(
  title = html_text2(prod_links),
  url   = html_attr(prod_links, 'href')
)

Unione dei dati delle tabelle e dei link

Spesso le celle di una tabella contengono link. Combini html_table() per i valori testuali con html_attr() mirato per i link incorporati, così da creare un data frame più completo.

library(rvest)
html <- read_html('
  <table class="results">
    <tr><th>Book</th><th>Author</th></tr>
    <tr>
      <td><a href="/b/1">Clean Code</a></td>
      <td>Robert Martin</td>
    </tr>
    <tr>
      <td><a href="/b/2">Refactoring</a></td>
      <td>Martin Fowler</td>
    </tr>
  </table>
')
# Get text from table
df <- html_table(html_element(html, 'table'))

# Get links embedded in first column
links <- html_attr(html_elements(html, 'table td a'), 'href')
df$url <- links
print(df)

Parametro fill di html_table()

A volte le tabelle HTML presentano celle mancanti o righe strutturate in modo irregolare. Il parametro fill=TRUE di html_table() riempie i valori mancanti con NA invece di generare un errore.

library(rvest)
html <- read_html('
  <table>
    <tr><th>Name</th><th>Score</th><th>Grade</th></tr>
    <tr><td>Alice</td><td>95</td><td>A</td></tr>
    <tr><td>Bob</td><td>80</td></tr>
  </table>
')
# Without fill=TRUE this may error on uneven rows
df <- html_table(html_element(html, 'table'), fill = TRUE)
print(df)
# Name  Score Grade
# Alice    95     A
# Bob      80  <NA>

# fill=TRUE is safe even when rows are uniform
is.na(df[2, 'Grade'])  # TRUE

Estrazione delle sorgenti delle immagini

Le immagini usano attributi src (e talvolta data-src per il caricamento differito). Lo stesso approccio con html_attr() estrae gli URL delle immagini per scaricarle o catalogarle.

library(rvest)
html <- read_html('
  <div class="gallery">
    <img src="/img/photo1.jpg" alt="Sunset">
    <img src="/img/photo2.jpg" alt="Mountains">
    <img data-src="/img/lazy.jpg" class="lazy" alt="Lake">
  </div>
')
# Regular images
images <- html_elements(html, 'img')
srcs  <- html_attr(images, 'src')
alts  <- html_attr(images, 'alt')

data.frame(alt = alts, src = srcs)
# For lazy-loaded images check data-src
lazy_src <- html_attr(html_element(html, '.lazy'), 'data-src')
lazy_src  # '/img/lazy.jpg'

Salvataggio dei dati estratti

Dopo aver estratto tabelle e link in un data frame, salvi i risultati con write.csv() o readr::write_csv(). Includa sempre un timestamp o l'URL di origine per garantire la tracciabilità dei dati.

library(rvest)
html <- read_html('
  <table>
    <tr><th>Product</th><th>Price</th></tr>
    <tr><td>Widget</td><td>9.99</td></tr>
    <tr><td>Gadget</td><td>14.50</td></tr>
  </table>
')
df <- html_table(html_element(html, 'table'))

# Add metadata
df$scraped_at <- Sys.time()
df$source_url <- 'https://example.com/products'

# Save to CSV
# write.csv(df, 'products.csv', row.names = FALSE)
print(df)
cat('Data ready for analysis or storage')

Verifica rapida

Verifichi la Sua comprensione dello scraping di tabelle HTML e link con rvest.

Riepilogo: tabelle e link

Punti chiave: html_table() converte automaticamente le tabelle HTML in data frame; usi fill=TRUE per le tabelle irregolari. Per i link, recuperi tutte le anchor con html_elements('a'), il testo con html_text2() e gli URL con html_attr('href'). Converta gli URL relativi in assoluti con xml2::url_absolute(). Filtri i link indesiderati in base a un pattern. Unisca il testo delle tabelle e gli URL dei link incorporati per ottenere dataset più completi.

library(rvest)
# Table scraping pattern:
# tables <- html_table(html_elements(page, 'table'))
# df <- tables[[1]]

# Link scraping pattern:
# links <- html_elements(page, 'a[href]')
# data.frame(
#   text = html_text2(links),
#   url  = xml2::url_absolute(
#            html_attr(links, 'href'),
#            base = base_url
#          )
# )

# Combine: scrape table text AND embedded link URLs
cat('Tables + links = most of what the web offers')

Domande Frequenti

La lezione «Acquisizione di tabelle e link» è gratuita?

Sì — il testo completo di «Acquisizione di tabelle e link» è 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 R Academy, passa a CoddyKit PRO. Il corso R Academy include 4 lezioni in totale.

Cosa imparerò in «Acquisizione di tabelle e link»?

Analizzi le tabelle HTML in data frame e raccolga tutti i collegamenti ipertestuali di una pagina. Eserciti R Academy 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 R Academy?

Non è richiesta alcuna esperienza precedente. R Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Acquisizione di tabelle e link»?

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 R Academy?

Sì. Ogni lezione R Academy 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

  1. Struttura HTML e selettori CSS
  2. Basi di html_element() e html_text()
  3. Acquisizione di tabelle e link
  4. Gestione della paginazione e di più pagine
← Torna a R Academy