我正在尝试使用rvest
自动从网站上抓取文本,但是当我尝试从向量book.titles.urls
读取网页网址的循环时,出现以下错误。但是,当我尝试从单个页面(无循环)中抓取所需文本时,它就可以正常工作:
工作代码
library(rvest)
library(tidyverse)
#Paste URL to be read by read_html function
lex.url <- 'https://fab.lexile.com/search/results?keyword=The+True+Story+of+the+Three+Little+Pigs'
lex.webpage <- read_html(lex.url)
#Use CSS selectors to scrape lexile numbers and covert data to text
lex.num <- html_nodes(lex.webpage, '.results-lexile-code')
lex.num.txt <- html_text(lex.num[1])
lex.num.txt
> lex.num.txt
[1] "AD510L"
代表
library(rvest)
library(tidyverse)
book.titles <- c("The+True+Story+of+the+Three+Little+Pigs",
"The+Teacher+from+the+Black+Lagoon",
"A+Letter+to+Amy",
"The+Principal+from+the+Black+Lagoon",
"The+Art+Teacher+from+the+Black+Lagoon")
book.titles.urls <- paste0("https://fab.lexile.com/search/results?keyword=", book.titles)
out <- length(book.titles)
for (i in seq_along(book.titles.urls)) {
node1 <- html_session(i)
lex.url <- as.character(book.titles.urls[i])
lex.webpage <- read_html(lex.url[i])
lex.num <- html_nodes(node1, lex.webpage[i], '.results-lexile-code')
lex.num.txt <- html_text(lex.num[i][1])
out <- lex.num.txt[i]
}
错误代码
httr :: handle(url)中的错误:is.character(url)不正确
答案 0 :(得分:2)
该错误是由于您将一个整数传递给html_session函数,该函数需要一个字符串(即url)。我认为没有必要创建会话,通常,如果需要使用用户ID和密码登录网站,则可以使用此功能。
您可以简化循环:
#output list
output<-list()
j<-1 #index
for (i in book.titles.urls) {
lex.num <- html_nodes(read_html(i), '.results-lexile-code')
# process the returned list of nodes, lex.num, here
output[[j]]<-html_text(lex.num)
j<-j+1
}
我尚未对此进行测试,但是我将提供以下警告:刮取网站时,请确保您同意并遵守服务协议的条款。
编辑:
这是使用lapply
的进一步简化,它返回带有每个调用语句结果的向量列表
library(dplyr)
listofresults<-lapply(book.titles.urls, function(i) {read_html(i) %>%
html_nodes( '.results-lexile-code') %>%
html_text()})