使用 R 和 rvest 进行网页抓取
Web scraping with R and rvest
我正在试验 rvest
以学习使用 R 进行网络抓取。我正在尝试为页面的其他几个部分复制 Lego 示例并使用 selector gadget
进行 id。
我从 R Studio tutorial 中提取了示例。使用下面的代码,1 和 2 有效,但 3 无效。
library(rvest)
lego_movie <- html("http://www.imdb.com/title/tt1490017/")
# 1 - Get rating
lego_movie %>%
html_node("strong span") %>%
html_text() %>%
as.numeric()
# 2 - Grab actor names
lego_movie %>%
html_nodes("#titleCast .itemprop span") %>%
html_text()
# 3 - Get Meta Score
lego_movie %>%
html_node(".star-box-details a:nth-child(4)") %>%
html_text() %>%
as.numeric()
可以看到在转换成数字之前,returns一个" 83/100\n"
lego_movie %>%
html_node(".star-box-details a:nth-child(4)") %>%
html_text()
# [1] " 83/100\n"
可以用trim=TRUE
省略\n
。您无法将其转换为数字,因为您有 /
。 :
lego_movie %>%
html_node(".star-box-details a:nth-child(4)") %>%
html_text(trim=TRUE)
# [1] "83/100"
如果将其转换为数字,您将收到 NA
警告,这并不意外:
# [1] NA
# Warning message:
# In function_list[[k]](value) : NAs introduced by coercion
如果您希望数字 83
作为最终答案,您可以使用 gsub
等正则表达式工具删除 100
和 \
(假设完整所有电影的得分都是 100)。
lego_movie %>%
html_node(".star-box-details a:nth-child(4)") %>%
html_text(trim=TRUE) %>%
gsub("100|\/","",.)%>%
as.numeric()
# [1] 83
我并没有真正跟上所有管道和相关代码的速度,所以可能有一些新的狂热工具可以做到这一点......但考虑到上面的答案可以让你 "83/100"
,你可以这样做:
as.numeric(unlist(strsplit("83/100", "/")))[1]
[1] 83
我猜管道看起来像这样:
lego_movie %>%
html_node(".star-box-details a:nth-child(4)") %>%
html_text(trim=TRUE) %>%
strsplit(., "/") %>%
unlist(.) %>%
as.numeric(.) %>%
head(., 1)
[1] 83
或者如 Frank 所建议的那样,您可以使用类似以下内容计算表达式 "83/100"
:
lego_movie %>%
html_node(".star-box-details a:nth-child(4)") %>%
html_text(trim=TRUE) %>%
parse(text = .) %>%
eval(.)
[1] 0.83
我正在试验 rvest
以学习使用 R 进行网络抓取。我正在尝试为页面的其他几个部分复制 Lego 示例并使用 selector gadget
进行 id。
我从 R Studio tutorial 中提取了示例。使用下面的代码,1 和 2 有效,但 3 无效。
library(rvest)
lego_movie <- html("http://www.imdb.com/title/tt1490017/")
# 1 - Get rating
lego_movie %>%
html_node("strong span") %>%
html_text() %>%
as.numeric()
# 2 - Grab actor names
lego_movie %>%
html_nodes("#titleCast .itemprop span") %>%
html_text()
# 3 - Get Meta Score
lego_movie %>%
html_node(".star-box-details a:nth-child(4)") %>%
html_text() %>%
as.numeric()
可以看到在转换成数字之前,returns一个" 83/100\n"
lego_movie %>%
html_node(".star-box-details a:nth-child(4)") %>%
html_text()
# [1] " 83/100\n"
可以用trim=TRUE
省略\n
。您无法将其转换为数字,因为您有 /
。 :
lego_movie %>%
html_node(".star-box-details a:nth-child(4)") %>%
html_text(trim=TRUE)
# [1] "83/100"
如果将其转换为数字,您将收到 NA
警告,这并不意外:
# [1] NA
# Warning message:
# In function_list[[k]](value) : NAs introduced by coercion
如果您希望数字 83
作为最终答案,您可以使用 gsub
等正则表达式工具删除 100
和 \
(假设完整所有电影的得分都是 100)。
lego_movie %>%
html_node(".star-box-details a:nth-child(4)") %>%
html_text(trim=TRUE) %>%
gsub("100|\/","",.)%>%
as.numeric()
# [1] 83
我并没有真正跟上所有管道和相关代码的速度,所以可能有一些新的狂热工具可以做到这一点......但考虑到上面的答案可以让你 "83/100"
,你可以这样做:
as.numeric(unlist(strsplit("83/100", "/")))[1]
[1] 83
我猜管道看起来像这样:
lego_movie %>%
html_node(".star-box-details a:nth-child(4)") %>%
html_text(trim=TRUE) %>%
strsplit(., "/") %>%
unlist(.) %>%
as.numeric(.) %>%
head(., 1)
[1] 83
或者如 Frank 所建议的那样,您可以使用类似以下内容计算表达式 "83/100"
:
lego_movie %>%
html_node(".star-box-details a:nth-child(4)") %>%
html_text(trim=TRUE) %>%
parse(text = .) %>%
eval(.)
[1] 0.83