Соскоб с R и Rvest

Я экспериментирую с rvest чтобы изучить веб-скребинг с R. Я пытаюсь повторить пример Lego для пары других разделов страницы и использую selector gadget к ид.

Я взял пример из учебника R Studio. С кодом ниже 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 ответа

Решение

Я не очень разбираюсь во всех каналах и связанном коде, поэтому, вероятно, есть несколько новых запутанных инструментов, чтобы сделать это... но, учитывая, что ответ выше поможет вам "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

Вы можете видеть, что перед преобразованием в числовое значение возвращает " 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
Другие вопросы по тегам