Объект не найден на языке R

#r #web-scraping

#r #очистка веб-сайта

Вопрос:

Я новичок в использовании R, и вот моя попытка воспроизвести код для очистки цитат с нескольких страниц

 # Load Libraries
library(rvest)      # To Scrape
library(tidyverse)  # To Manipulate Data

# Scrape Multiple Pages
for (i in 1:4){
  site_to_scrape <- read_html(paste0("http://quotes.toscrape.com/page/",i))
  temp <- site_to_scrape html_nodes(".text") html_text()
  content <- append(content, temp)
}

#Export Results To CSV File
write.csv(content, file = "content.csv", row.names = FALSE)
  

Я столкнулся с ошибкой Object not found в отношении переменной содержимого. Как я могу преодолеть эту ошибку и настроить объект таким образом, чтобы его можно было повторно использовать в строке добавления?

Ответ №1:

Увеличение вектора в цикле очень неэффективно, если вы очищаете много страниц. Вместо этого вам следует инициализировать список с определенной длиной, которую вы знаете заранее.

 library(rvest)
n <- 4
content = vector('list', n)

# Scrape Multiple Pages
for (i in 1:n){
  site_to_scrape <- read_html(paste0("http://quotes.toscrape.com/page/",i))
  content[[i]] <- site_to_scrape %>%
    html_nodes(".text") %>%
    html_text()
}
write.csv(unlist(content), file = "content.csv", row.names = FALSE)
  

Другой вариант без инициализации — использовать sapply / lapply :

 all_urls <- paste0("http://quotes.toscrape.com/page/",1:4)
content <- unlist(lapply(all_urls, function(x) 
               x %>% read_html %>%  html_nodes(".text") %>% html_text()))
  

Ответ №2:

Я искал и нашел способ назначить пустой объект перед циклом content = c()

 # Load Libraries
library(rvest)      # To Scrape
library(tidyverse)  # To Manipulate Data

content = c()

# Scrape Multiple Pages
for (i in 1:4){
  site_to_scrape <- read_html(paste0("http://quotes.toscrape.com/page/",i))
  temp <- site_to_scrape %>%
    html_nodes(".text") %>%
    html_text()
  content <- append(content, temp)
}

#Export Results To CSV File
write.csv(content, file = "content.csv", row.names = FALSE)