在r-跳过零值中读取



我正在尝试使用R函数读取可读取从www.racingpost.com上的在线数据库收集数据。我有一个具有30,000个独特ID的CSV文件,可用于识别单个马匹。不幸的是,这些ID中有少数正在引导读取以返回错误:

(function (classes, fdef, mtable)中的错误: 无法找到函数的继承方法'readhtmltable'用于签名'" null"'

我的问题是 - 是否可以设置一个包装函数,该功能会跳过返回空值但然后继续读取其余的HTML表的ID?读数停止以每个空值。

到目前为止我尝试过的是:

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

都是有效的马IDS栏0011,它将返回零值。然后:

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))
}

但是,我认为错误是在IF语句中返回的,这意味着该函数达到第一个空值时会停止。任何帮助将不胜感激 - 非常感谢。

您可以先分析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)

使用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)

最后一行丢弃了所有"失败"尝试。如果要保持它们,只需删除最后一行

相关内容

  • 没有找到相关文章

最新更新