Очистка веб-страниц в R — получение «Ошибки в записях [[x]] …. предоставлено больше элементов, чем требуется заменить»

#r #web-scraping #rvest #rscript

#r #очистка веб-страниц #rvest #rscript

Вопрос:

Пожалуйста, обратите внимание, что я очень новичок в очистке веб-страниц в R и самом R, поэтому при объяснении ответа, пожалуйста, имейте это в виду…

Я пытаюсь очистить веб-данные о дате пребывания, названии отзыва и рецензии

Здесь я генерирую список URL-адресов, которые я хочу использовать:

 library(rvest)
#GENERATING THE URLS
webpage_list <- vector(mode = "list")
#creating empty list
webpage_list

for(n in seq(from=5, to=15, by=5)){
  webpage_list[[n]] <- glue::glue("https://www.sampleURL.com#REVIEWS")
}

#droping the empty values
webpage_list[sapply(webpage_list,is.null)] <- NULL
webpage_list
  

Затем преобразуйте список в вектор символов и выполните итерацию по start, определяя область на веб-странице, которую я хочу очистить

 webpage_list2 <- unlist(webpage_list)
class(webpage_list2)

for(i in seq_along(webpage_list2)){
  webpage <- read_html(webpage_list2[i])

  results <- webpage %>% html_nodes(".oETBfkHU , ._3hDPbqWO")
  print(results)

  # Building the dataset
  records <- vector("character", length = (length(results)))
  print(records)
}
  

Кажется, работает так, как я хочу (я думаю) до этого момента

 for (x in seq_along(results)) {
    url <- read_html(webpage_list2[x])
    dateOfStay <- str_c(url %>% 
                          html_nodes("._34Xs-BQm") %>% 
                          html_text())
    reviewTitle <- str_sub(url %>%
                             html_nodes(".glasR4aX")%>%
                             html_text())
    review <- str_sub(url %>%
                        html_nodes(".IRsGHoPm") %>%
                        html_text())
    records[[x]] <- data_frame(dateOfStay = dateOfStay, reviewTitle = reviewTitle, review = review)#, reviewTitle = reviewTitle, review = review
  }
#Build DF
DF <- bind_rows(records)

  

Из этого я получаю приведенную ниже ошибку:

 Error in records[[x]] <- data_frame(dateOfStay = dateOfStay, reviewTitle = reviewTitle,  :    more elements supplied than there are to replace
  

Я был бы весьма признателен за любую помощь, а также, пожалуйста, обратите внимание, что я очень новичок в очистке веб-страниц в R и самом R, поэтому при объяснении ответа, пожалуйста, имейте это в виду.

Комментарии:

1. К вашему сведению: у вас могут возникнуть трудности с получением ответов на этот конкретный вопрос, поскольку tripadvisor запрещает очистку в своих условиях предоставления услуг и в своих robots.txt.

2. @AdamSampson Я этого не знал! Спасибо, что дали мне знать. Я делаю это исключительно для задания в колледже (что, я знаю, не имеет значения). Независимо от того, где выполняется очистка, есть ли способ обойти ошибку из-за использования многочисленных URL-адресов?

3. Да. На самом деле ваша проблема — это то, что я могу исправить без очистки. Поэтому мне не нужно беспокоиться об условиях предоставления услуг в моем ответе.

Ответ №1:

Без очистки мы можем найти вашу проблему. Вы пытаетесь поместить фрейм данных внутри символьного вектора. Фрейм данных не является символом. Так что это неправильные размеры. Вы можете исправить это, превратив записи в список, или обернуть свой фрейм данных в список, чтобы принудительно преобразовать его в один элемент. Я рекомендую составлять записи в виде списка.

 records <- vector("character", length = (3))
records[[2]] <- data.frame(test = "A",test2 = "B")
# Error in records[[2]] <- data.frame(test = "A", test2 = "B") : 
#   more elements supplied than there are to replace

# Option 1:
records <- list(length = (3))                  
records[[2]] <- data.frame(test = "A",test2 = "B")
records
# $`length`
# [1] 3
# 
# [[2]]
#   test test2
# 1    A     B


# Option 2:
records <- vector("character", length = (3))
records[[2]] <- list(data.frame(test = "A",test2 = "B"))
# records
# [[1]]
# [1] ""
# 
# [[2]]
#   [[2]][[1]]
#   test test2
# 1    A     B
# 
# 
# [[3]]
# [1] ""