htmltab обходной путь "таблица не найдена"? - PullRequest
1 голос
/ 30 мая 2019

Я пытаюсь очистить некоторые (много) данные о баскетболе мужчин NCAA с веб-сайта под названием RealGM.Мой код лежит ниже:

    library(htmltab)
     tables <- list()
     for (i in 0:1548) {
         for (j in 0:16) {
             for (k in 0:4) {
                  a <- i+1
                  b <- 2003+j
                  c <- k+1
                  url <- paste("https://basketball.realgm.com/ncaa/conferences/Big-Ten-Conference/2/Michigan/",a,"/individual-games/",b,"/minutes/Season/desc/",c,sep = "")
                  tables[[paste(i,j,k,sep = "")]] <- htmltab(url,rm_nodata_cols = F,which = 1)
             }
         }
     }

В прошлом я использовал подобные методы для извлечения данных с сайтов, таких как Sports Reference, которые хранят данные игроков в таблицах.

В этом цикле переменная a контролирует команду, b контролирует год, а c контролирует номер страницы для набора игрового журнала.

Моя проблема заключается в том, что некоторые из упомянутых URL-адресовне содержат таблиц, то есть нет 4-й страницы игровых журналов для команды Мичигана 2003 года, но есть 5 страниц для их команды 2018.

К сожалению, htmltab возвращает ошибку, когда таблица не найдена, и прерываетсямоя петля.Есть ли обходной путь для этого, чтобы он просто пропускал эти URL и / или продолжал до конца процесса?

Ответы [ 2 ]

1 голос
/ 02 июня 2019

Мне удалось выяснить, как это сделать, сначала проверив, существует ли таблица, а если нет, перейдите к следующей итерации цикла:

    library(htmltab)
    tables <- list()
     for (i in 0:1548) {
             for (j in 0:16) {
                     for (k in 0:4) {
                              a <- i+1
                              b <- 2003+j
                              c <- k+1
                              url <- paste("https://basketball.realgm.com/ncaa/conferences/Big-Ten-Conference/2/Michigan/",a,"/individual-games/",b,"/minutes/Season/desc/",c,sep = "")
                      test <- html_nodes(read_html(url),"table")
                      if (length(test) == 0){
                          next
                      }
                           tables[[paste(i,j,k,sep = "")]] <- htmltab(url,rm_nodata_cols = F,which = 1)
                 }
         }
 }
0 голосов
/ 02 июня 2019

Один из вариантов - использовать tryCatch и пропустить URL, которые выдают ошибку.

library(htmltab)

tables <- list()
for (i in 1:1549) {
   for (j in 2003:2019) {
     for (k in 1:5) {
       url <- paste0("https://basketball.realgm.com/ncaa/conferences/Big-Ten-Conference/2/Michigan/",i,"/individual-games/",j,"/minutes/Season/desc/",k)
       tables[[paste0(i,j,k)]] <- tryCatch({
        htmltab(url,rm_nodata_cols = F,which = 1)
        }, error = function(e) {
        cat("Wrong URL : ", url, " skipping\n")
        })
       }
     }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...