使用R和rvest进行Web抓取

时间:2015-06-20 13:46:29

标签: r rvest

我正在尝试使用rvest来学习使用R进行网页抓取。我正在尝试将Lego示例复制到页面的其他几个部分,并使用selector gadget来识别。

我从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()

2 个答案:

答案 0 :(得分:3)

我并没有真正掌握所有管道和相关代码的速度,所以可能有一些新的fandangled工具可以做到这一点......但鉴于上面的答案可以让你进入"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

或者正如弗兰克建议的那样,你可以用以下内容评估表达式"83/100"

lego_movie %>% 
  html_node(".star-box-details a:nth-child(4)") %>%
  html_text(trim=TRUE) %>%
  parse(text = .) %>%
  eval(.)
[1] 0.83

答案 1 :(得分:2)

您可以看到,在转换为数字之前,它会返回" 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