我有一个数据框,其中包含我要从中抓取数据的100行URL。如果要复制该行中的URL并将其保存在变量“ url”中,请执行以下操作:
webpage <- read_html(url, encoding = "windows-874").
一切正常,但是如果我做一个循环来调用数据帧并逐行执行read_html
,则会出现错误:
“ UseMethod(” read_xml“)中的错误:没有适用于'read_xml'的适用方法,该方法适用于类” c('tbl_df','tbl','data.frame')“”
我认为这与read_html
无法读取tibble
的事实有关,但我无法找到解决方案。我尝试将输入read_html
的URL的数据类型更改为字符,数字,向量等各种数据类型,但没有一个能够解决问题。
您的帮助将不胜感激。
数据框“ URLSetTrade”是从csv文件导入的,包含以下格式的数据行:
row1 -> 'https://www.settrade.com/AnalystConsensus/C04_10_stock_saa_p1.jsp?txtSymbol=wha&ssoPageId=9&selectPage=10'
row2 -> 'https://www.settrade.com/AnalystConsensus/C04_10_stock_saa_p1.jsp?txtSymbol=prm&ssoPageId=9&selectPage=10'
etc. etc.
读取网址的功能
getBatchAnalystData <- function(URLRow){
url <- URLSetTrade[URLRow,1]
webpage <- read_html(url, encoding = "windows-874")
target_price_html <- html_nodes(webpage,'td')
target_price_data <- html_text(target_price_html)
sub("-","",target_price_data)
为简单而省略 analyzerPriceDataFrame <-data.frame(Number = double(),............和其他代码,用于将从读取网页中获得的文本输入到dataframe中
return(analystPriceDataFrame)
}
调用read url函数的循环
for (i in 1:nrow(URLSetTrade)) { assign(paste0(EarningDate2019_07_28_Cleaned[i,1],
"AnalystData"),getBatchAnalystData(i))
}
答案 0 :(得分:1)
据我所知,xml2::read_html
要求其输入x
是单个URL,而不是向量(长度为2或更大)的向量。使用单个函数调用读取多个URL的一种方法是使用类似purrr::map
的函数。 purrr::map
将列表和函数(在我们的例子中为xml2::read_html
)作为输入,并返回将函数应用于输入列表的每个元素的结果。如果您以前从未使用过purrr
,则可能需要从CRAN安装它。
mylist <- list("http://nytimes.com", "http://economist.com")
purrr::map(mylist, xml2::read_html)
从您的问题来看,您似乎需要为read_html
指定其他参数。您可以通过在调用purrr::map
中命名它们(及其值)来实现此目的。
purrr::map(mylist, xml2::read_html, encoding = "windows-874")
其中mylist
现在是您真正想要的URL列表(而不是我上面粘贴的URL)。我希望这会有所帮助。