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 hrefFiltraggio 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-isEstrazione 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']) # TRUEEstrazione 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
- Struttura HTML e selettori CSS
- Basi di html_element() e html_text()
- Acquisizione di tabelle e link
- Gestione della paginazione e di più pagine