rvest
网页爬虫
encoding调整字符编码
描述:
这些函数能帮助你对那些有错误编码声明的
网页进行调整.你可以使用guess_encoding
得到正确编码, 或者用repair_encoding
来休整字符型向量.
使用:
guess_encoding(x)
repair_encoding(x, from = NULL)
参数:
参数 | 说明 |
---|---|
x | 字符型向量 |
from | 字符的实际编码 |
stringi:
函数封装自stringi包, 需要先安装.
例子:
# This page claims to be in iso-8859-1:
url <- 'http://www.elections.ca/content.aspx?section=res&dir=cir/list&document=index&lang=e#list'
elections <- html(url)
x <- elections %>% html_nodes("table") %>% .[[2]] %>% html_table() %>% .$TO
# But something looks wrong:
x
# It's acutally UTF-8!
guess_encoding(x)
# We can repair this vector:
repair_encoding(x)
# But it's better to start from scratch with correctly encoded file
elections <- html(url, encoding = "UTF-8")
elections %>% html_nodes("table") %>% .[[2]] %>% html_table() %>% .$TO
提出TO列的值
[1] "Bonavista–Gander–Grand Falls–Windsor" "St. John's East"
[3] "St. John's South–Mount Pearl"
提出FROM列的值
> elections %>% html_nodes("table") %>% .[[2]] %>% html_table() %>% .$FROM
[1] "Bonavista–Exploits" "St. John's North" "St. John's South"
google_form从给定的id中获取谷歌表格
例子
google_form("1M9B8DsYNFyDjpwSK6ur_bZf8Rv_04ma3rmaaBiveoUI")
html解析HTML网页
函数
html(x, ..., encoding = NULL)
参数
参数 | 说明 |
---|---|
x | 可以是url,本地路径,包含html的字符串,或者来自httr的请求如果x是URL参数就传递给GET() |
encoding | 文档的编码形式,查看iconvlist()有完整列表,他如果不能正确确定encoding方式可以尝试stri_enc_detect |
例子
# From a url:
google <- html("http://google.com")
google %>% xml_structure()
google %>% html_nodes("p")
# From a string: (minimal html 5 document)
# http://www.brucelawson.co.uk/2010/a-minimal-html5-document/
minimal <- html("<!doctype html>
<meta charset=utf-8>
<title>blah</title>
<p>I'm the content")
minimal
# From an httr request
google2 <- html(httr::GET("http://google.com"))
html_form ?
例子
html_form(html("https://hadley.wufoo.com/forms/libraryrequire-quiz/"))
html_form(html("https://hadley.wufoo.com/forms/r-journal-submission/"))
box_office <- html("http://www.boxofficemojo.com/movies/?id=ateam.htm")
box_office %>% html_node("form") %>% html_form()
html_nodes收集HTML中的节点
描述:
使用XPath和css更简单的分片提取HTML, 结合selectorgadget他能够简单地找到应该使用哪个css selector。如果没用用过CSS selector, 参见github的教程
函数:
html_nodes(x, css, xpath)
html_node(x, css, xpath)
参数:
参数 | 说明 |
---|---|
x | 完整的文档(XMLInternalDocument),tags列表(XMLNodeSet),单一的tag(XMLInternalElementNode) |
css,xpath | 要收集的节点。css和xpath 两种selector方式可选 |
html_node vs html_nodes 区别:
html_node类似[[
只输出一个元素。当给了一个节点列表时,html_node
将返回一个长度相等的列表。
例子:
# CSS selectors ----------------------------------------------
ateam <- html("http://www.boxofficemojo.com/movies/?id=ateam.htm")
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")
# When applied to a list of nodes, html_nodes() collapses output
# html_node() selects a single element from each
td <- ateam %>% html_nodes("center") %>% html_nodes("td")
td %>% html_nodes("font")
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")
html_session() Simulate a session in an html browser
函数:
html_session(url, …)
is.session(x)
参数:
参数 | 说明 |
---|---|
url | 开始session的地址 |
。。。 | 这整个session的httr配置参数 |
x | 欲测试是否是session的object |
方法:
一个session结构可以响应httr和html方法的操作:使用cookies(), headers(), status_code()访问请求的属性,以及可以使用html_nodes
访问html。
例子:
# http://stackoverflow.com/questions/15853204
s <- html_session("http://had.co.nz")
s %>% jump_to("thesis") %>% jump_to("/") %>% session_history()
s %>% jump_to("thesis") %>% back() %>% session_history()
s %>% follow_link(css = "p a")
html_table 解析html中的表为数据框
函数:
html_table(x, header = NA, trim = TRUE, fill = FALSE, dec = “.”)
参数:
参数 | 说明 |
---|---|
x | 一个节点,节点集合或文件 |
header | 第一列作为表头?如果是NA,并且表包含标签,就是用第一行作为表头 |
trim | 删除空白? |
fill | 如果TRUE,自动填充缺失为NA |
dec | 字符转换为10进制 |
假设前提:
- 每个单元格无跨行
- 第一行是header
例子:
tdist <- html("http://en.wikipedia.org/wiki/Student%27s_t-distribution")
tdist %>%
html_node("table.infobox") %>%
html_table(header = FALSE)
births <- html("http://www.ssa.gov/oact/babynames/numberUSbirths.html")
html_table(html_nodes(births, "table")[[2]])
# If the table is badly formed, and has different number of rows in
# each column use fill = TRUE. Here's it's due to incorrect colspan
# specification.
skiing <- html("http://data.fis-ski.com/dynamic/results.html?sector=CC&raceid=22395")
skiing %>%
html_table(fill = TRUE)
html_text 从html抽取属性、文本和标签
函数:
html_text(x, …)
html_tag(x)
html_children(x)
html_attrs(x)
html_attr(x, name, default = NA_character_)
参数:
参数 | 说明 |
---|---|
x | 完整的文档(XMLInternalDocument),标签列表(XMLNodeSet)或(XMLInternalElementNode) |
… | 其他参数传递给xmlValue().最有用的参数是trim = TRUE,他可以移除空白 |
name | 提取的属性名 |
default | 若任何一个节点的属性不存在则用这里设置的string参数 |
例子:
movie <- html("http://www.imdb.com/title/tt1490017/")
cast <- html_nodes(movie, "#titleCast span.itemprop")
html_text(cast)
html_tag(cast)
html_attrs(cast)
html_attr(cast, "class")
html_attr(cast, "itemprop")
basic <- html("<p class='a'><b>Bold text</b></p>")
p <- html_node(basic, "p")
p
# Can subset with numbers to extract children
p[[1]]
# Use html_attr to get attributes
html_attr(p, "class")
jump_to 指向到新链接
jump_to() 得到相对或绝对链接; follow_link() 通过表达式找到当前页面下的链接
使用:
jump_to(x, url, …)
follow_link(x, i, css, xpath, …)
参数:
参数 | 说明 |
---|---|
x | A session |
url | 可以使相对或绝对的url |
… | httr配置参数 |
i | 整形 选取第i个链接 2. 字符串 找到第一个包含此string的链接 |
例子:
s <- html_session("http://had.co.nz")
s %>% jump_to("thesis/") # 跳转到/thesis
s %>% follow_link("vita") # 找到含有vita的链接跳转
s %>% follow_link(3)# 找到第三个的链接跳转
s %>% follow_link("vita")
pluck 提取元素所属列表的位置
函数:
pluck(x, i, type)
参数:
参数 | 说明 |
---|---|
x | 列表 |
i | 字符串或整形 |
type | 输出形式 |
scrape scrape
session_history 历史记录导航工具
函数:
session_history(x)
back(x)
参数x : A session
set_values 设置表单中的值
函数:
set_values(form, …)
参数:
参数 | 说明 |
---|---|
form | 欲修改的表格 |
… | 名称-值对 |
例子:
search <- html_form(html("https://www.google.com"))[[1]]
set_values(search, q = "My little pony")
set_values(search, hl = "fr")
## Not run: set_values(search, btnI = "blah")
submit_form 上传
函数:
submit_form(session, form, submit = NULL, …)
参数:
参数 | 说明 |
---|---|
session | Session to submit form to. |
form | Session to submit form to. |
submit | 上传使用的button名,如果没有设置,默认为form第一个上传的button |
… | GET()和POST()的附加参数 |
例子:
test <- google_form("1M9B8DsYNFyDjpwSK6ur_bZf8Rv_04ma3rmaaBiveoUI")
f0 <- html_form(test)[[1]]
f1 <- set_values(f0, entry.564397473 = "abc")
xml
与HTML操作相同. 目前将XML解码成HTML.
函数:
xml(x, …, encoding = NULL)
xml_tag(x)
xml_attr(x, name, default = NA_character_)
xml_attrs(x)
xml_node(x, css, xpath)
xml_nodes(x, css, xpath)
xml_text(x, …)
xml_children(x)
参数:
参数 | 说明 |
---|---|
x | 可以是url,本地路径,包含html的字符串,或httr请求的结果 |
… | 如果x是URl,就是GET()的附加参数 |
name | 提取出的属性名 |
default | 当属性名不存在,就用default作为属性名 |
例子:
search <- xml("http://stackoverflow.com/feeds")
entries <- search %>% xml_nodes("entry")
entries[[1]] %>% xml_structure()
entries %>% xml_node("author name") %>% xml_text()
entries %>% lapply(. %>% xml_nodes("category") %>% xml_attr("term"))# 提取category下的term值,lapply注意学习!
entries %>% lapply(. %>% xml_nodes(“category”) %>% xml_attr(“term”))# 提取category下的term值,lapply注意学习!
xml_structure 显示结构
函数:
xml_structure(x, indent = 0)
参数:
x |
indent |