我正在尝试使用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)
最后一行丢弃了所有"失败"尝试。如果要保持它们,只需删除最后一行