Scraping tabel i linków
Parsuj tabele HTML do ramek danych i zbieraj wszystkie hiperłącza na stronie.
Scraping tabel i linków to bezpłatna lekcja R Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej R Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs R Academy zawiera 4 lekcji w sumie.
Tabele HTML na stronach internetowych
Tabele HTML (<table>) są najwygodniejszym celem scrapingu, ponieważ mają już określoną strukturę. Funkcja html_table() z rvest bezpośrednio konwertuje je na ramki danych R i automatycznie obsługuje nagłówki.
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() dla całej strony
Gdy strona zawiera wiele tabel, użyj funkcji html_elements() (w liczbie mnogiej), aby pobrać wszystkie tabele, a następnie zastosuj html_table() do wynikowego nodeset, aby otrzymać listę ramek danych. Wybierz potrzebną tabelę za pomocą indeksu.
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)Czyszczenie danych tabeli
Tabele pobrane ze stron internetowych często mają nieuporządkowane nagłówki, scalone komórki lub nadmiarowe białe znaki. Użyj janitor::clean_names() do uporządkowania nagłówków oraz standardowych operacji dplyr/stringr do oczyszczenia wartości komórek.
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)Pobieranie wszystkich odnośników ze strony
Odnośniki to znaczniki kotwic (<a>) zawierające atrybuty href. Użyj html_elements(page, 'a'), aby pobrać wszystkie kotwice, następnie html_attr('href') do pobrania adresów URL i html_text2() do pobrania tekstu odnośników.
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 hrefFiltrowanie wartościowych odnośników
Na rzeczywistych stronach odnośniki nawigacyjne, odnośniki w stopce i kotwice wewnętrzne występują razem z odnośnikami, których faktycznie potrzebujesz. Odfiltruj je, usuwając wartości NA, kotwice (#) i odnośniki javascript:, a następnie zastosuj dopasowywanie wzorców, aby pozostawić tylko odpowiednie adresy URL.
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)Od względnych do bezwzględnych adresów URL
Pobrane wartości href często są względnymi ścieżkami, takimi jak /page. Przekształć je w bezwzględne adresy URL, dodając na początku bazowy adres URL. Funkcja xml2::url_absolute() robi to poprawnie.
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-isUkierunkowane pobieranie odnośników
Zamiast pobierać wszystkie odnośniki i następnie je filtrować, użyj konkretnych selektorów CSS, aby wybrać tylko potrzebne odnośniki. Połącz kontekst elementu z selektorami atrybutów, aby uzyskać większą precyzję.
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')
)Łączenie danych tabel i odnośników
Często komórki tabel zawierają odnośniki. Połącz html_table() do pobierania wartości tekstowych z ukierunkowanym użyciem html_attr() do pobierania osadzonych odnośników, aby utworzyć bogatszą ramkę danych.
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)Parametr fill funkcji html_table()
Tabele HTML czasami zawierają brakujące komórki lub nieregularnie zbudowane wiersze. Parametr fill=TRUE w funkcji html_table() uzupełnia brakujące wartości jako NA, zamiast zgłaszać błąd.
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']) # TRUEPobieranie źródeł obrazów
Obrazy używają atrybutów src (a czasami data-src do leniwego ładowania). To samo podejście z użyciem html_attr() pozwala pobierać adresy URL obrazów w celu ich pobrania lub skatalogowania.
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'Zapisywanie pobranych danych
Po pobraniu tabel i odnośników do ramki danych zapisz wyniki za pomocą write.csv() lub readr::write_csv(). Zawsze dołączaj znacznik czasu lub źródłowy adres URL, aby zachować informacje o pochodzeniu danych.
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')Szybki test
Sprawdź, czy rozumiesz pobieranie tabel HTML i odnośników za pomocą rvest.
Podsumowanie: tabele i odnośniki
Najważniejsze informacje: html_table() automatycznie konwertuje tabele HTML na ramki danych; użyj fill=TRUE w przypadku nieregularnych tabel. Aby pobierać odnośniki, pobierz wszystkie kotwice za pomocą html_elements('a'), tekst za pomocą html_text2(), a adresy URL za pomocą html_attr('href'). Przekształcaj względne adresy URL w bezwzględne za pomocą xml2::url_absolute(). Filtruj niechciane odnośniki według wzorca. Łącz tekst tabel z adresami URL osadzonych odnośników, aby uzyskać bogatsze zbiory danych.
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')Ucz się R dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 43
- Lekcje
- 159
Często zadawane pytania
Czy lekcja „Scraping tabel i linków” jest bezpłatna?
Tak — pełny tekst „Scraping tabel i linków” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu R Academy, przejdź na CoddyKit PRO. Kurs R Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Scraping tabel i linków”?
Parsuj tabele HTML do ramek danych i zbieraj wszystkie hiperłącza na stronie. Ćwiczysz R Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć R Academy?
Nie wymagamy żadnego doświadczenia. R Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Scraping tabel i linków”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji R Academy?
Tak. Każda lekcja R Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Struktura HTML i selektory CSS
- Podstawy html_element() i html_text()
- Scraping tabel i linków
- Obsługa paginacji i wielu stron