2016-08-08 3 views
0

Для небольшого проекта для себя Я пытаюсь получить результаты от некоторых рас. Я могу получить доступ к страницам с результатами и загрузить данные из таблицы на странице. Однако на странице есть только 20 результатов, но, к счастью, веб-адреса построены логически, поэтому я могу их создать и в цикле получить доступ к этим страницам и загрузить данные. Тем не менее, каждая категория имеет различное количество гонщиков и, следовательно, может иметь разное количество страниц. Я хочу избежать необходимости вручную проверять, сколько гонщиков есть в каждой категории.Проверьте, существует ли таблица на веб-сайте R

Моя первая мысль заключалась в том, чтобы просто создать много ссылок, убедившись, что их достаточно (в зависимости от общего количества гонщиков), чтобы получить все данные.

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) Как-то проверьте все ссылки, если они существуют. Я попытался использовать url.exists из пакета RCurl. Но это не работает. Он возвращает TRUE для всех страниц, поскольку страница существует, у нее просто нет таблицы (так что для меня это было бы ложным положительным). Как-то мне понадобится код, чтобы проверить, существует ли таблица на странице, но я не знаю, как это сделать.

2) Подавить сообщение об ошибке из readHTMLTable, чтобы цикл продолжался, но я не уверен, что это возможно.

Любые предложения по этим двум методам или любые другие предложения?

ответ

0

Я думаю, что метод # 2 проще. I modified your code с tryCatch, одним из встроенных механизмов обработки исключений R. Меня устраивает.

PS Я бы рекомендовал использовать rvest для веб-соскабливания следующим образом.

+0

Спасибо! Хорошо работает, я никогда не сталкивался с tryCatch раньше, полезная функция! – egilio

Смежные вопросы