0Pricing
R Academy · Pelajaran

Scraping Tabel dan Tautan

Uraikan tabel HTML menjadi data frame dan kumpulkan semua hyperlink pada halaman.

Scraping Tabel dan Tautan adalah pelajaran R Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar R Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus R Academy mencakup 4 pelajaran total.

Tabel HTML di Halaman Web

Tabel HTML (<table>) adalah target yang paling mudah untuk diambil karena sudah memiliki struktur. html_table() milik rvest mengonversinya langsung menjadi kerangka data R dan menangani header secara otomatis.

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() pada Halaman Penuh

Ketika sebuah halaman memiliki beberapa tabel, gunakan html_elements() (bentuk jamak) untuk mendapatkan semua tabel, lalu gunakan html_table() pada kumpulan node yang dihasilkan untuk mengembalikan daftar kerangka data. Pilih tabel yang Anda perlukan berdasarkan indeks.

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)

Membersihkan Data Tabel

Tabel yang diambil dari situs web sering memiliki header yang berantakan, sel gabungan, atau spasi berlebih. Gunakan janitor::clean_names() untuk header, serta operasi standar dplyr/stringr untuk membersihkan nilai sel.

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)

Mengambil Semua Tautan pada Halaman

Tautan adalah tag anchor (<a>) dengan atribut href. Gunakan html_elements(page, 'a') untuk mendapatkan semua anchor, lalu gunakan html_attr('href') untuk URL dan html_text2() untuk teks tautan.

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

Memfilter Tautan yang Bermakna

Halaman nyata memiliki tautan navigasi, tautan footer, dan anchor internal yang bercampur dengan tautan yang sebenarnya Anda inginkan. Lakukan penyaringan dengan menghapus NA, anchor (#), dan tautan javascript:, lalu terapkan pencocokan pola untuk mempertahankan hanya URL yang relevan.

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)

Dari URL Relatif ke Absolut

Nilai href yang diambil sering berupa jalur relatif seperti /page. Konversikan menjadi URL absolut dengan menambahkan URL dasar di depannya. Fungsi xml2::url_absolute() menangani hal ini dengan benar.

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

Pengambilan Tautan Terarah

Daripada mengambil semua tautan lalu memfilternya, gunakan selector CSS tertentu untuk menargetkan hanya tautan yang Anda perlukan. Gabungkan konteks elemen dan selector atribut untuk memperoleh hasil yang presisi.

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')
)

Menggabungkan Data Tabel dan Tautan

Sering kali sel tabel berisi tautan. Gabungkan html_table() untuk nilai teks dengan html_attr() terarah untuk tautan yang disematkan guna membangun kerangka data yang lebih kaya.

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)

Parameter fill pada html_table()

Tabel HTML terkadang memiliki sel yang hilang atau baris dengan struktur tidak beraturan. Parameter fill=TRUE dalam html_table() mengisi nilai yang hilang dengan NA alih-alih menghasilkan kesalahan.

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

Mengekstrak Sumber Gambar

Gambar menggunakan atribut src (dan terkadang data-src untuk pemuatan lambat). Pendekatan html_attr() yang sama dapat mengekstrak URL gambar untuk diunduh atau dikatalogkan.

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'

Menyimpan Data yang Diambil

Setelah mengambil tabel dan tautan ke dalam kerangka data, simpan hasilnya dengan write.csv() atau readr::write_csv(). Selalu sertakan stempel waktu atau URL sumber untuk memastikan asal-usul data dapat ditelusuri.

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')

Pemeriksaan Singkat

Uji pemahaman Anda tentang pengambilan tabel HTML dan tautan dengan rvest.

Ringkasan: Tabel dan Tautan

Hal-hal penting: html_table() secara otomatis mengonversi tabel HTML menjadi kerangka data; gunakan fill=TRUE untuk tabel yang tidak beraturan. Untuk tautan, dapatkan semua anchor dengan html_elements('a'), teks dengan html_text2(), dan URL dengan html_attr('href'). Konversikan URL relatif menjadi absolut dengan xml2::url_absolute(). Saring tautan yang tidak diinginkan berdasarkan pola. Gabungkan teks tabel dan URL tautan yang disematkan untuk memperoleh kumpulan data yang lebih kaya.

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')

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Scraping Tabel dan Tautan” gratis?

Ya — teks lengkap “Scraping Tabel dan Tautan” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus R Academy, upgrade ke CoddyKit PRO. Kursus R Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Scraping Tabel dan Tautan”?

Uraikan tabel HTML menjadi data frame dan kumpulkan semua hyperlink pada halaman. Kamu berlatih R Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai R Academy?

Tidak diperlukan pengalaman sebelumnya. R Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Scraping Tabel dan Tautan” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran R Academy ini?

Ya. Setiap pelajaran R Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Struktur HTML dan Pemilih CSS
  2. Dasar-Dasar html_element() dan html_text()
  3. Scraping Tabel dan Tautan
  4. Menangani Paginasi dan Banyak Halaman
← Kembali ke R Academy