Select nodes from an HTML document

More easily extract pieces out of HTML documents using XPath and css selectors. CSS selectors are particularly useful in conjunction with it makes it easy to find exactly which selector you should be using. If you have't used css selectors before, work your way through the fun tutorial at

html_nodes(x, css, xpath)

html_node(x, css, xpath)


Either a document, a node set or a single node.

css, xpath

Nodes to select. Supply one of css or xpath depending on whether you want to use a css or xpath 1.0 selector.

html_node vs html_nodes

html_node is like [[ it always extracts exactly one element. When given a list of nodes, html_node will always return a list of the same length, the length of html_nodes might be longer or shorter.

CSS selector support

CSS selectors are translated to XPath selectors by the selectr package, which is a port of the python cssselect library,

It implements the majority of CSS3 selectors, as described in The exceptions are listed below:

  • Pseudo selectors that require interactivity are ignored: :hover, :active, :focus, :target, :visited

  • The following pseudo classes don't work with the wild card element, *: *:first-of-type, *:last-of-type, *:nth-of-type, *:nth-last-of-type, *:only-of-type

  • It supports :contains(text)

  • You can use !=, [foo!=bar] is the same as :not([foo=bar])

  • :not() accepts a sequence of simple selectors, not just single simple selector.

  • html_node
  • html_nodes
library(rvest) # NOT RUN { # CSS selectors ---------------------------------------------- ateam <- read_html("") html_nodes(ateam, "center") html_nodes(ateam, "center font") html_nodes(ateam, "center font b") # But html_node is best used in conjunction with %>% from magrittr # You can chain subsetting: ateam %>% html_nodes("center") %>% html_nodes("td") ateam %>% html_nodes("center") %>% html_nodes("font") td <- ateam %>% html_nodes("center") %>% html_nodes("td") td # When applied to a list of nodes, html_nodes() returns all nodes, # collapsing results into a new nodelist. td %>% html_nodes("font") # html_node() returns the first matching node. If there are no matching # nodes, it returns a "missing" node if (utils::packageVersion("xml2") > "0.1.2") { td %>% html_node("font") } # To pick out an element at specified position, use magrittr::extract2 # which is an alias for [[ library(magrittr) ateam %>% html_nodes("table") %>% extract2(1) %>% html_nodes("img") ateam %>% html_nodes("table") %>% `[[`(1) %>% html_nodes("img") # Find all images contained in the first two tables ateam %>% html_nodes("table") %>% `[`(1:2) %>% html_nodes("img") ateam %>% html_nodes("table") %>% extract(1:2) %>% html_nodes("img") # XPath selectors --------------------------------------------- # chaining with XPath is a little trickier - you may need to vary # the prefix you're using - // always selects from the root noot # regardless of where you currently are in the doc ateam %>% html_nodes(xpath = "//center//font//b") %>% html_nodes(xpath = "//b") # }
Documentation reproduced from package rvest, version 0.3.2, License: GPL-3

Community examples

Looks like there are no examples yet.