Web Scraping(在R中) - readHTMLTable错误

时间:2016-06-10 08:48:09

标签: r

我有一个名为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函数吗?

1 个答案:

答案 0 :(得分:1)

read.csvshcedule中创建一个data.frame。然后,您希望按行(seq_alongschedule[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向量的第一个元素