Я хотел бы почистить отзывы сотрудников от kununu.Сайт kununu имеет две специфические особенности, о которых необходимо позаботиться: 1. на первом сайте отображаются только первые 10 отзывов на одну компанию и 2. не все элементы, которые я хочу собрать, присутствуют в каждом обзоре (в некоторых из них отсутствуют значения)узлы).
Мой код отлично работает для одной компании.Но я не могу заставить его работать для списка URL (например, url <- c ("<a href="https://www.kununu.com/de/novartis-pharma/kommentare" rel="nofollow noreferrer">https://www.kununu.com/de/novartis-pharma/kommentare"," https://www.kununu.com/de/merckaa/kommentare")
Я пробовал много разных подходов - но ничего не получалось, такдалеко - может быть, один из вас знает хитрость. Большое спасибо всем заранее!
Мой рабочий код (одна компания) выглядит так:
url <- "https://www.kununu.com/de/novartis-pharma/kommentare"
num_of_reviews <- read_html(url) %>%
html_nodes(".company-profile-subnav .active .title-number") %>%
.[[1]] %>%
html_text()
# round up to nearest 10s
num_of_reviews_rounded <- num_of_reviews %>%
as.numeric() %>%
round_any(10, f = ceiling)
pages <- 1 : (num_of_reviews_rounded / 10)
get_reviews <- function(url){
reviews <- url %>%
read_html() %>%
html_nodes(".review-content")
quote <- reviews %>%
lapply(.%>% html_nodes(".review-title a") %>%
html_text() %>% ifelse(identical(., character(0)), NA, .)) %>% unlist
date <- reviews %>%
lapply(.%>% html_nodes(".hidden+ span") %>%
html_text() %>% ifelse(identical(., character(0)), NA, .)) %>% unlist
rating_image <- reviews %>%
lapply(.%>% html_nodes(".review-ratings .rating-group:nth-child(13) .rating-badge") %>%
html_text() %>% ifelse(identical(., character(0)), NA, .)) %>% unlist
statement <- reviews %>%
lapply(.%>% html_nodes(".col-sm-10 > div:nth-child(1)") %>%
html_text() %>% ifelse(identical(., character(0)), NA, .)) %>% unlist
a<-data.frame(quote, date, rating_image, statement,
stringsAsFactors = FALSE)
return(a)
}
list_of_dfs <- lapply(pages, function(x)get_reviews(paste0(url,"/",x)))
dfshort <- do.call(rbind, list_of_dfs)
str(dfshort)