检查网站内的表是否存在R.

时间:2016-08-08 03:55:23

标签: r xml

对于我自己的一个小项目,我试图从某些比赛中获得结果。 我可以访问带有结果的页面,并从页面中的表格下载数据。但是,每页只有20个结果,但幸运的是,Web地址是逻辑构建的,因此我可以创建它们,并在循环中访问这些页面并下载数据。但是,每个类别都有不同数量的参赛者,因此可以有不同的页数。我想避免手动检查每个类别中有多少赛车手。

我的第一个想法是只生成很多链接,确保有足够的(基于参赛者总数)来获取所有数据。

nrs <- rep(seq(1,5,1),2)
sex <- c("M","M","M","M","M","F","F","F","F","F") 

links <- NULL

#Loop to create 10 links, 5 for the male age grou 18-24, 5 for women agegroup 18-24. However,
#there are only 3 pages in the male age group with a table.
 for (i in 1:length(nrs) ) {                                                                   
 links[i] = paste("http://www.ironman.com/triathlon/events/americas/ironman/texas/results.aspx?p=",nrs[i],"&race=texas&rd=20160514&sex=",sex[i],"&agegroup=18-24&loc=",sep="")    
}

resultlist <- list() #create empty list to store results

for (i in 1:length(links)) {
results = readHTMLTable(links[i],
                      as.data.frame = TRUE, 
                      which=1,
                      stringsAsFactors = FALSE,
                      header = TRUE) #get data
resultlist[[i]] <- results #combine results in one big list
}

results = do.call(rbind, resultlist) #combine results into dataframe

正如您在此代码中看到的那样,readHTMLTable在遇到没有表的页面时会立即抛出错误消息,然后停止。

我想到了两种可能的解决方案。

1)以某种方式检查所有链接是否存在。我尝试使用RCurl包中的url.exists。但这并不奏效。它为所有页面返回TRUE,因为页面存在,它只是没有表格(所以对我来说这将是一个误报)。不知何故,我需要一些代码来检查页面中的表是否存在,但我不知道如何去做。

2)从readHTMLTable中删除错误消息,使循环连续,但我不确定是否可能。

对这两种方法或任何其他建议的任何建议?

1 个答案:

答案 0 :(得分:0)

我认为方法#2更容易。我modified your codetryCatch,R的内置异常处理机制之一。它对我有用。

PS我建议使用rvest进行网页抓取。