我有一个名为Schedule.csv的文件,其结构如下:
URLs
http://www.basketball-reference.com/friv/dailyleaders.cgi?month=10&day=27&year=2015
http://www.basketball-reference.com/friv/dailyleaders.cgi?month=10&day=28&year=2015
我正在尝试使用以下问题中提供的解释来抓取html表,但它不起作用:How to scrape HTML tables from a list of links
我目前的代码如下:
library(XML)
schedule<-read.csv("Schedule.csv")
stats <- list()
for(i in seq_along(schedule))
{
print(i)
total <- readHTMLTable(schedule[i])
n.rows <- unlist(lapply(total, function(t) dim(t)[1]))
stats[[i]] <- as.data.frame(total[[which.max(n.rows)]])
}
运行此代码时出现错误,如下所示:
Error in (function (classes, fdef, mtable) : unable to find an inherited method for function ‘readHTMLTable’ for signature ‘"data.frame"’
如果我按照下面的方式在向量中手动输入URL,那么当我运行readHTMLTable代码时,我得到了我想要的内容。
schedule<-c("http://www.basketball-reference.com/friv/dailyleaders.cgi?month=10&day=27&year=2015","http://www.basketball-reference.com/friv/dailyleaders.cgi?month=10&day=28&year=2015")
有人可以向我解释为什么read.csv没有给我一个可用的信息向量来输入readHTMLTable函数吗?
答案 0 :(得分:1)
read.csv
在shcedule
中创建一个data.frame。然后,您希望按行(seq_along
和schedule[i]
沿着数据框的列工作)来访问它。
在您的情况下,您可以这样做:
for (i in 1:nrow (schedule)) {
total <- readHTMLTable(schedule[i, 1])
据我所知,您需要data.frame的第一列,否则请更改, 1]
或使用列名。
另请注意,read.csv会将您的第一列读作因子,因此您可能更愿意将其读作字符:
schedule<-read.csv("Schedule.csv", as.is = TRUE)
如果您的文件具有唯一列,则另一种方法是使用readLines
,然后您可以将循环保持原样...
schedule<-readLines("Schedule.csv")
stats <- list()
for(i in seq_along(schedule))
{
print(i)
total <- readHTMLTable(schedule[i])
...
但请注意列名,因为它们位于schedule
向量的第一个元素