在日期列表上使用readHTMLTable并使用数据创建新日期列

时间:2016-01-25 22:25:10

标签: xml r web-scraping rcurl

我正在尝试编写一个循环来对我通过公式提供的连续日期列表执行readHTMLTable()。我已成功导入日期之间的所有数据。但是,该数据不具有日期列,因此使用我提供循环的日期序列,我希望循环读取HTMLMLable,然后添加一个新列,其中包含用于该迭代的日期。

这是我到目前为止所做的:

library(XML)
library(RCurl)
library(plyr)

# create the days
x <- seq(as.Date("2015-04-10"), as.Date("2015-04-15"), by = "day")

# create a url template for sprintf()
utmp <- "http://www.basketball-reference.com/friv/dailyleaders.cgi?month=%d&day=%d&year=%d"

# convert to numeric matrix after splitting for year, month, day
m <- do.call(rbind, lapply(strsplit(as.character(x), "-"), type.convert))

# create the list to hold the results
tables <- vector("list", length(m))

# get the tables
for(i in seq_len(nrow(m))) {
  # create the url for the day and if it exists, read it - if not, NULL
  tables[[i]] <- if(url.exists(u <- sprintf(utmp, m[i, 2], m[i, 3], m[i, 1]))) 
    readHTMLTable(u, stringsAsFactors = FALSE)
  else NULL
}

data <- ldply(tables,data.frame)

所以基本上,我希望我的最终数据框能够将m作为一个名为data$Date的新列。

感谢您提供任何帮助,如果您需要任何澄清,请与我们联系!

1 个答案:

答案 0 :(得分:1)

考虑使用mapply()(应用系列的多变量函数),在其中传递日期,网址和表迭代器列表以下载html表。您可以避免矩阵处理,因为format()可以提取部分日期类型。另外,请考虑不对不存在的URL使用NULL,因为它可能不会在之后绑定。只需过滤掉空元素。

# LIST OF DATES
x <- lapply(0:5, function(i) as.Date("2015-04-10")+i)     

# LIST OF URLS
utmp <- "http://www.basketball-reference.com/friv/dailyleaders.cgi?month=%d&day=%d&year=%d"
urlist <- c(lapply(x, function(i) sprintf(utmp, as.numeric(format(i, '%m')), 
                                                as.numeric(format(i, '%d')), 
                                                as.numeric(format(i, '%y')))))

# USER DEFINED FUNCTION
tables <- vector("list", length(x))
tabledwnld <- function(dt, url, i) {                      
                   if (url.exists(url)) {
                      tableNodes <- readHTMLTable(url)                       
                      tables[[i]] <- tableNodes[[1]]
                      tables[[i]]['Date'] <- dt
                      return(tables)
                   } 
              }
# APPLY ABOVE FUNCTION (RETURNS LARGE MATRIX OF TABLES)
data <- mapply(tabledwnld, x, urlist, 1:6)

# BIND TO DATA FRAME
finaldata <- do.call(rbind, data)

另外,请注意评论中的@ hrbrmstr警告,如下所示。您可能希望将表格下载空间分开:

  

除非本段另有规定,否则您同意不这样做   使用或启动任何自动化系统,包括但不限于   访问机器人,蜘蛛,离线阅读器或类似设备   站点以向站点服务器发送更多请求消息的方式   在任何给定的时间段内,通常都是典型的人   通过使用传统的在线Web浏览器在同一时期生产   阅读,查看和提交材料。