#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)