Соскоб с 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