所以这就是它.请记住,在编写代码时我完全是绿色的,而且我没有R之外的经验. 上下文 – 我想要抓取的每个页面都有一个遵循以下格式的URL: http://www.hockey-reference.com/friv/dailyleaders.cgi?
上下文 – 我想要抓取的每个页面都有一个遵循以下格式的URL:
http://www.hockey-reference.com/friv/dailyleaders.cgi?month=10和天= 8&安培;年= 2014
此网址中更改的变量是月,日和年(以粗体显示)
网址应从10-8-2014开始,到2015年6月18日结束.当然不是每天都有NHL游戏,所以有些页面会空白.
所有其他页面都有一个用于玩家的HTML表格和一个守门员表格.
我已经想出了如何抓取并导出到csv只是一个单页,并且不知道从哪里开始制作它以便我可以在上一季的每一场比赛中一举一动(落在我的日期之内)上面已经提到过)
代码如下:
library(XML) NHL <- htmlParse("http://www.hockey-reference.com/friv/dailyleaders.cgi?month=10&day=8&year=2014") class(NHL) NHL.tables <- readHTMLTable(NHL,stringAsFactors = FALSE) length(NHL.tables) head(NHL.tables[[1]]) tail(NHL.tables[[1]]) head(NHL.tables[[2]]) tail(NHL.tables[[2]]) write.csv(NHL.tables, file = "NHLData.csv")
提前致谢!
我不确定你是怎么写csv的,但是这里你可以得到这些日期之间的所有表格.我在前几个网址上对此进行了测试,效果很好.请注意,在读取表之前不需要解析html,因为readHTMLTable()能够直接从URL读取和解析.library(XML) library(RCurl) # create the days x <- seq(as.Date("2014-10-12"), as.Date("2015-06-18"), by = "day") # create a url template for sprintf() utmp <- "http://www.hockey-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(allurls)) # 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 }
str()很长,所以这里是第一个元素尺寸的一小部分
lapply(tables[[1]], dim) # $skaters # [1] 72 23 # # $goalies # [1] 7 15
上面的for()循环将构造一个URL,然后检查它是否存在于序列中的每一天.如果存在,我们继续阅读当天的表格.如果不是,那个list元素将为NULL.请看看这个,如果它适合你,那么我们将把它写入文件.