พื้นฐาน html_element() และ html_text()
ดึงข้อความ แอตทริบิวต์ และข้อมูลตารางจากหน้าที่ขูดมา
พื้นฐาน html_element() และ html_text() เป็นบทเรียน R Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน R Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน
read_html(): โหลดหน้าเว็บ
read_html() เป็นจุดเริ่มต้นของ rvest โดยรับ URL หรือสตริง HTML ดิบ แล้วส่งคืนออบเจ็กต์ xml_document ที่แทนโครงสร้าง DOM ซึ่งผ่านการแยกวิเคราะห์แล้วและพร้อมสำหรับการค้นหา
library(rvest)
# From a URL (requires internet connection)
# page <- read_html('https://books.toscrape.com')
# From a raw HTML string (great for testing)
page <- read_html('
<html><body>
<h1>Book Store</h1>
<p class="desc">Over 1000 books!</p>
</body></html>
')
class(page) # 'xml_document' 'xml_node'html_element() กับ html_elements()
html_element() ส่งคืนโหนดแรกที่ตรงกัน (หรือ NA หากไม่พบ) ส่วน html_elements() ส่งคืนโหนดที่ตรงกันทั้งหมดเป็นรายการ ใช้รูปเอกพจน์เมื่อคาดว่าจะได้ผลลัพธ์เพียงหนึ่งรายการ และใช้รูปพหูพจน์เมื่อดึงข้อมูลรายการหลายรายการ
library(rvest)
page <- read_html('
<ul>
<li class="item">Apple</li>
<li class="item">Banana</li>
<li class="item">Cherry</li>
</ul>
')
# Singular: gets first match
first_item <- html_element(page, '.item')
html_text2(first_item) # 'Apple'
# Plural: gets all matches
all_items <- html_elements(page, '.item')
html_text2(all_items) # c('Apple', 'Banana', 'Cherry')
length(all_items) # 3html_text2() สำหรับข้อความที่สะอาด
html_text2() แยกเนื้อหาข้อความจากโหนด โดยลบแท็ก HTML และรวมช่องว่างส่วนเกินอย่างเป็นระเบียบ นอกจากนี้ยังจัดการ <br> ให้เป็นการขึ้นบรรทัดใหม่ได้ ส่วน html_text() รุ่นเก่าจัดการช่องว่างได้ไม่ฉลาดเท่า
library(rvest)
page <- read_html('
<div class="product">
<h2> Laptop </h2>
<p>Price: <strong>$999</strong></p>
<p> Free shipping </p>
</div>
')
# html_text2 trims whitespace intelligently
title <- html_element(page, 'h2')
html_text2(title) # 'Laptop' (no extra spaces)
# From the whole div - collapses nested text
div <- html_element(page, '.product')
html_text2(div) # 'Laptop\nPrice: $999\nFree shipping'html_attr(): แยกแอตทริบิวต์
html_attr(node, 'attr_name') แยกค่าของแอตทริบิวต์ HTML ซึ่งจำเป็นอย่างยิ่งสำหรับการดึง href จากลิงก์ src จากรูปภาพ แอตทริบิวต์ data-* และข้อมูลอื่น ๆ
library(rvest)
page <- read_html('
<div>
<a href="https://example.com" title="Example site">Visit</a>
<img src="/images/photo.jpg" alt="A photo">
<div data-price="29.99">Product</div>
</div>
')
# Extract href from link
link <- html_element(page, 'a')
html_attr(link, 'href') # 'https://example.com'
html_attr(link, 'title') # 'Example site'
# Extract src from image
img <- html_element(page, 'img')
html_attr(img, 'src') # '/images/photo.jpg'
# Extract data attributes
div <- html_element(page, 'div[data-price]')
html_attr(div, 'data-price') # '29.99'html_attrs(): แอตทริบิวต์ทั้งหมด
html_attrs(node) ส่งคืนเวกเตอร์อักขระแบบมีชื่อ ซึ่งประกอบด้วยแอตทริบิวต์ ALL ของโหนด เหมาะสำหรับกรณีที่คุณยังไม่ทราบชื่อแอตทริบิวต์ล่วงหน้า หรือต้องการตรวจสอบว่าองค์ประกอบนั้นมีข้อมูลใดให้ใช้บ้าง
library(rvest)
page <- read_html('
<a href="/page" class="nav-link" id="home" data-section="main">Home</a>
')
link <- html_element(page, 'a')
# Get all attributes at once
attrs <- html_attrs(link)
attrs
# href class id data-section
# '/page' 'nav-link' 'home' 'main'
# Access by name
attrs['href'] # '/page'
attrs['class'] # 'nav-link'
names(attrs) # all attribute nameshtml_children(): โหนดลูก
html_children(node) ส่งคืนโหนดลูกโดยตรงขององค์ประกอบ เมื่อนำมาใช้ร่วมกับ html_name() เพื่อรับชื่อแท็ก จะมีประโยชน์สำหรับทำความเข้าใจโครงสร้างหน้าเว็บด้วยโปรแกรม
library(rvest)
page <- read_html('
<nav>
<a href="/">Home</a>
<a href="/about">About</a>
<span>|</span>
<a href="/contact">Contact</a>
</nav>
')
nav <- html_element(page, 'nav')
# Get all direct children
kids <- html_children(nav)
length(kids) # 4
# Get tag names of children
html_name(kids) # c('a', 'a', 'span', 'a')
# Filter to only anchor children
links <- kids[html_name(kids) == 'a']
html_text2(links) # c('Home', 'About', 'Contact')html_name(): ชื่อแท็ก
html_name(node) ส่งคืนชื่อแท็กของโหนดเป็นสตริงตัวพิมพ์เล็ก เช่น 'div', 'p' และ 'a' เหมาะสำหรับกรองรายการโหนดตามชนิดองค์ประกอบหลังจากดึงข้อมูลแล้ว
library(rvest)
page <- read_html('
<article>
<h2>Title</h2>
<p>First paragraph.</p>
<img src="img.jpg">
<p>Second paragraph.</p>
</article>
')
article <- html_element(page, 'article')
all_children <- html_children(article)
# Check tag name of each child
html_name(all_children)
# c('h2', 'p', 'img', 'p')
# Get only paragraph children
paras <- all_children[html_name(all_children) == 'p']
html_text2(paras)
# c('First paragraph.', 'Second paragraph.')การเชื่อมการเลือกเข้าด้วยกัน
คุณสามารถส่งโหนด (ไม่ใช่เฉพาะเอกสาร) เป็นอาร์กิวเมนต์แรกให้กับ html_element() ได้ การทำเช่นนี้จะจำกัดการค้นหาให้อยู่ภายในโหนดนั้น ซึ่งสำคัญอย่างยิ่งเมื่อต้องดึงโครงสร้างที่เกิดซ้ำ เช่น การ์ดสินค้า หรือแถวตาราง
library(rvest)
page <- read_html('
<div class="card">
<h3>Laptop</h3>
<span class="price">$999</span>
</div>
<div class="card">
<h3>Phone</h3>
<span class="price">$499</span>
</div>
')
# Get all cards, then extract fields from each
cards <- html_elements(page, '.card')
names_list <- html_text2(html_elements(page, '.card h3'))
prices_list <- html_text2(html_elements(page, '.card .price'))
data.frame(name = names_list, price = prices_list)html_attr กับ NodeSet
เมื่อเรียกใช้กับ ชุดโหนด (ผลลัพธ์จาก html_elements()) html_attr() จะส่งคืนเวกเตอร์ค่าของแอตทริบิวต์ โดยมีหนึ่งค่าต่อหนึ่งโหนด หากไม่มีแอตทริบิวต์จะส่งคืน NA
library(rvest)
page <- read_html('
<ul>
<li><a href="/page1">Page 1</a></li>
<li><a href="/page2">Page 2</a></li>
<li><span>No link</span></li>
<li><a href="/page3">Page 3</a></li>
</ul>
')
# Get all a elements
links <- html_elements(page, 'a')
# html_attr on a nodeset returns a vector
hrefs <- html_attr(links, 'href')
hrefs # c('/page1', '/page2', '/page3')
# Link text alongside hrefs
texts <- html_text2(links)
data.frame(text = texts, href = hrefs)การจัดการองค์ประกอบที่หายไป
html_element() จะส่งคืนโหนด NA (ไม่ใช่ NULL) เมื่อไม่พบสิ่งที่ตรงกัน การใช้ html_text2() กับโหนด NA จะส่งคืน NA_character_ ตรวจสอบ NA ในผลลัพธ์เสมอเมื่อองค์ประกอบนั้นอาจไม่มีอยู่
library(rvest)
page <- read_html('
<div class="product">
<h3>Widget</h3>
<!-- No price tag here -->
</div>
')
# Element exists
title <- html_element(page, 'h3')
html_text2(title) # 'Widget'
# Element does NOT exist -> NA node
price <- html_element(page, '.price')
html_text2(price) # NA
is.na(html_text2(price)) # TRUE
# Safe extraction with default
price_text <- html_text2(price)
if (is.na(price_text)) price_text <- 'N/A'
price_text # 'N/A'นำทุกอย่างมาประกอบกัน
รวม html_elements(), html_text2() และ html_attr() เพื่อดึงข้อมูลที่มีโครงสร้างลงในกรอบข้อมูล ซึ่งเป็นเป้าหมายทั่วไปของการดึงข้อมูลจากเว็บไซต์ด้วย rvest
library(rvest)
page <- read_html('
<div class="book">
<a href="/book/1" class="title">R Programming</a>
<span class="author">Hadley Wickham</span>
<span class="rating" data-stars="5">*****</span>
</div>
<div class="book">
<a href="/book/2" class="title">Advanced R</a>
<span class="author">Hadley Wickham</span>
<span class="rating" data-stars="5">*****</span>
</div>
')
titles <- html_text2(html_elements(page, '.title'))
authors <- html_text2(html_elements(page, '.author'))
links <- html_attr(html_elements(page, 'a.title'), 'href')
ratings <- html_attr(html_elements(page, '.rating'), 'data-stars')
data.frame(title=titles, author=authors, link=links, stars=ratings)ตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความรู้เกี่ยวกับฟังก์ชันหลักของ rvest สำหรับการนำทางในเอกสาร HTML
ทบทวน: ฟังก์ชันหลักของ rvest
ประเด็นสำคัญ: read_html() โหลดหน้าเว็บ html_element() ดึงผลลัพธ์ที่ตรงกันรายการแรก และ html_elements() ดึงผลลัพธ์ที่ตรงกันทั้งหมด แยกข้อความด้วย html_text2() แอตทริบิวต์ด้วย html_attr() โหนดลูกด้วย html_children() และชื่อแท็กด้วย html_name() องค์ประกอบที่หายไปจะส่งคืนโหนด NA ดังนั้นต้องจัดการ NA ในโปรแกรมดึงข้อมูลที่ใช้งานจริงเสมอ
library(rvest)
# Core rvest workflow:
# 1. Load page
# page <- read_html(url)
# 2. Find elements
# node <- html_element(page, 'css-selector')
# nodes <- html_elements(page, 'css-selector')
# 3. Extract content
# html_text2(node) -> text content
# html_attr(node, 'href') -> attribute value
# html_attrs(node) -> all attributes
# html_name(node) -> tag name
# html_children(node) -> child nodes
# 4. Build data frame
# data.frame(title = html_text2(...), link = html_attr(...))
cat('rvest follows the tidy data philosophy')คำถามที่พบบ่อย
บทเรียน “พื้นฐาน html_element() และ html_text()” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “พื้นฐาน html_element() และ html_text()” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส R Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “พื้นฐาน html_element() และ html_text()”
ดึงข้อความ แอตทริบิวต์ และข้อมูลตารางจากหน้าที่ขูดมา คุณปฏิบัติ R Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน R Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน R Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “พื้นฐาน html_element() และ html_text()” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน R Academy นี้ได้ไหม
ได้ บทเรียน R Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- โครงสร้าง HTML และตัวเลือก CSS
- พื้นฐาน html_element() และ html_text()
- การขูดตารางและลิงก์
- การจัดการการแบ่งหน้าและหลายหน้า