2017-02-16 3 views
2

Я пытаюсь использовать функцию R readHTMLTable для сбора данных из онлайн-базы данных по адресу www.racingpost.com. У меня есть файл CSV с 30 000 уникальными идентификаторами, которые можно использовать для идентификации отдельных лошадей. К сожалению, небольшое количество этих идентификаторов является ведущим readHTMLTable вернуть ошибку:readHTMLTable in R - пропуск значений NULL

Ошибка в (function (classes, fdef, mtable): не смогли найти наследуемый метод для функции «readHTMLTable» для подписи «„NULL“»

Моего вопроса is - возможно ли настроить функцию-оболочку, которая будет пропускать идентификаторы, возвращающие значения NULL, а затем продолжить чтение оставшихся таблиц HTML? Чтение останавливается при каждом значении NULL.

То, что я пытался до сих пор это:

ids = c(896119, 766254, 790946, 556341, 62736, 660506, 486791, 580134, 0011, 580134) 

, которые все действительные лошади Идентификаторы бара, в 0011, который возвращает значение NULL. Тогда:

scrapescrape <- function(x) {  
    link <- paste0("http://www.racingpost.com/horses/horse_home.sd?horse_id=",x)  
    if (!is.null(readHTMLTable(link, which=2))) { 
    Frame1 <- readHTMLTable(link, which=2) 
    } 
} 

total_data = c(0) 
for (id in ids) { 
    total_data = rbind(total_data, scrapescrape(id)) 
} 

Однако, я думаю, что ошибка возвращается в, если заявлении, которое означает функцию останавливается, когда он достигает первое значение NULL. Любая помощь будет принята с благодарностью - большое спасибо.

ответ

2

Прежде чем читать таблицу HTML, вы можете сначала проанализировать HTML (проверить страницу, которую вы получаете, и найти способ распознать ложный результат).

Но вы также можете убедиться, что функция ничего не возвращает (NA), когда выдается ошибка, например, так:

library(XML) 

scrapescrape <- function(x) { 

    link <- paste0("http://www.racingpost.com/horses/horse_home.sd?horse_id=",x) 

    tryCatch(readHTMLTable(link, which=2), error=function(e){NA}) 

    } 
} 

ids <- c(896119, 766254, 790946, 556341, 62736, 660506, 486791, 580134, 0011, 580134) 

lst <- lapply(ids, scrapescrape) 

str(lst) 
2

Использование rvest вы можете сделать:

require(rvest) 
require(purrr) 
paste0("http://www.racingpost.com/horses/horse_home.sd?horse_id=", ids) %>% 
    map(possibly(~html_session(.) %>% 
       read_html %>% 
       html_table(fill = TRUE) %>% 
       .[[2]], 
       NULL)) %>% 
    discard(is.null) 

Последние сброшенные строки все «неудачные» попытки. Если вы хотите, чтобы они просто оставили последнюю строку

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