R Academy · Oppitunti

html_element()- ja html_text()-funktioiden perusteet

Poimikaa kaapatuista sivuista tekstiä, attribuutteja ja taulukkodataa.

Oppitunti 2/413 vaihetta

html_element()- ja html_text()-funktioiden perusteet on ilmainen R Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu R Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. R Academy-kurssilla on yhteensä 4 oppituntia.

read_html(): Sivun lataaminen

read_html() on rvestin aloituspiste. Välittäkää sille URL-osoite tai raaka HTML-merkkijono. Se palauttaa jäsennettyä DOM-puuta edustavan xml_document-olion, jota voidaan heti käsitellä kyselyillä.

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() ja html_elements()

html_element() palauttaa ensimmäisen vastaavan solmun (tai NA:n, jos vastaavaa ei löydy). html_elements() palauttaa kaikki vastaavat solmut listana. Käyttäkää yksikkömuotoista funktiota, kun odotatte täsmälleen yhtä tulosta, ja monikkomuotoista, kun keräätte luetteloita.

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)  # 3

html_text2() siistin tekstin hakemiseen

html_text2() poimii solmujen tekstisisällön, poistaa HTML-tunnisteet ja tiivistää välilyönnit siististi. Se käsittelee <br>-tunnisteet rivinvaihtoina. Vanhempi html_text() käsittelee välilyöntejä heikommin.

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(): Attribuuttien poimiminen

html_attr(node, 'attr_name') poimii HTML-attribuutin arvon. Tämä on olennaista, kun linkeistä haetaan href-attribuutti, kuvista src-attribuutti, data-*-attribuutit ja muita attribuutteja.

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(): Kaikki attribuutit

html_attrs(node) palauttaa nimettynä merkkivektorina solmun KAIKKI attribuutit. Tämä on hyödyllistä, kun attribuuttien nimiä ei tiedetä etukäteen tai haluatte tarkastella, mitä attribuutteja elementissä on käytettävissä.

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 names

html_children(): Lapsisolmut

html_children(node) palauttaa elementin välittömät lapsisolmut. Yhdessä html_name()-funktion kanssa sitä voidaan käyttää sivun rakenteen ohjelmalliseen selvittämiseen.

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(): Tunnisteiden nimet

html_name(node) palauttaa solmun tunnisteen nimen pienillä kirjaimilla merkkijonona (esimerkiksi 'div', 'p' tai 'a'). Tämä on hyödyllistä solmuluetteloiden suodattamisessa elementtityypin perusteella haun jälkeen.

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

Valintojen ketjuttaminen

Voitte välittää html_element()-funktion ensimmäiseksi argumentiksi dokumentin sijaan solmun. Tällöin haku rajataan kyseisen solmun sisälle — tämä on olennaista toistuvien rakenteiden, kuten tuotekorttien tai taulukkorivien, keräämisessä.

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-solmujoukolla

Kun html_attr()-funktiota kutsutaan nodeset-solmujoukolle (html_elements()-funktion tulokselle), se palauttaa attribuuttiarvojen vektorin, jossa on yksi arvo solmua kohden. Puuttuvien attribuuttien arvoksi palautetaan 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)

Puuttuvien elementtien käsittely

html_element() palauttaa NA-solmun (ei NULL-arvoa), kun vastaavaa ei löydy. NA-solmulle kutsuttu html_text2() palauttaa arvon NA_character_. Tarkistakaa tuloksista aina NA-arvot, kun elementit voivat olla valinnaisia.

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'

Kokonaisuuden yhdistäminen

Yhdistämällä html_elements()-, html_text2()- ja html_attr()-funktiot voitte kerätä jäsenneltyä dataa data frameen — tämä on tavallisesti rvestillä tehtävän web-sivujen tietojen keruun päätavoite.

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)

Pikatarkistus

Testatkaa tietonne rvestin keskeisistä HTML-dokumenttien käsittelyyn tarkoitetuista funktioista.

Kertaus: rvestin keskeiset funktiot

Tärkeimmät opit: read_html() lataa sivuja, html_element() palauttaa ensimmäisen osuman ja html_elements() kaikki osumat. Poimikaa tekstiä html_text2()-funktiolla, attribuutteja html_attr()-funktiolla, lapsisolmuja html_children()-funktiolla ja tunnisteiden nimiä html_name()-funktiolla. Puuttuvat elementit palauttavat NA-solmuja — käsitelkää NA-arvot aina tuotantokäyttöön tarkoitetuissa kerääjissä.

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

Opi R tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
43
Oppitunnit
159

Usein kysytyt kysymykset

Onko oppitunti ”html_element()- ja html_text()-funktioiden perusteet” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa R Academy-oppimispolun 3 oppituntia, myös oppitunnin “html_element()- ja html_text()-funktioiden perusteet”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. R Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”html_element()- ja html_text()-funktioiden perusteet”?

Poimikaa kaapatuista sivuista tekstiä, attribuutteja ja taulukkodataa. Harjoittelet R Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni R Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin R Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”html_element()- ja html_text()-funktioiden perusteet”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä R Academy-oppitunnilla?

Kyllä. Jokainen R Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. HTML-rakenne ja CSS-valitsimet
  2. html_element()- ja html_text()-funktioiden perusteet
  3. Taulukoiden ja linkkien kaapiminen
  4. Sivutuksen ja useiden sivujen käsittely
← Takaisin: R Academy