R JSONlite:如何解决以下错误?

R JSONlite:如何解决以下错误?,r,web-scraping,jsonlite,R,Web Scraping,Jsonlite,请参阅下面的R代码,我正在使用JSONlite包从网站上抓取数据: 有什么建议吗?如果a$seasure\u history为空(以第57页为例),那么当您执行data.frame(a[1]、a[20]、a[21]、as.data.frame(a$seasure\u history))时,前3个元素有一行(它们是标量),最后一个元素有零行。在您的函数中,您可以首先检查是否存在a$seasure\u历史记录。如果不是,您可以在其位置创建一行NAs 但是,您的代码还有一个问题,您可能还没有意识到。并

请参阅下面的R代码,我正在使用JSONlite包从网站上抓取数据:


有什么建议吗?

如果
a$seasure\u history
为空(以第57页为例),那么当您执行
data.frame(a[1]、a[20]、a[21]、as.data.frame(a$seasure\u history))
时,前3个元素有一行(它们是标量),最后一个元素有零行。在您的函数中,您可以首先检查是否存在
a$seasure\u历史记录。如果不是,您可以在其位置创建一行
NA
s

但是,您的代码还有一个问题,您可能还没有意识到。并非696的每个页面都存在,当您试图从中提取数据时,会出现404错误。在执行最后的
do.call(rbind,…)
步骤之前,我添加了一些步骤来删除这些页面

library(jsonlite)
url <- "http://fantasy.premierleague.com/web/api/elements/"
seasonsdata <- data.frame(matrix(NA, nrow = 1, ncol = 20))
seasonsdata <- seasonsdata[-1, ]
fetchData <- function(i) {
  res <- try(a <- fromJSON(paste0(url, i)))
  if (!inherits(res, "try-error")) {
    if (nrow(as.data.frame(a$season_history)) == 0) {
      b <- data.frame(a[1], a[20], a[21], as.data.frame(matrix(NA, ncol = 17)))
    } else {
      b <- data.frame(a[1], a[20], a[21], as.data.frame(a$season_history))
    }
  }
}

seasonsdata <- lapply(1:696, fetchData)
seasonsdata <- seasonsdata[!sapply(seasonsdata, is.null)]
seasonsdata <- seasonsdata[sapply(seasonsdata, is.data.frame)]
seasonsdata <- do.call(rbind,lapply(seasonsdata, data.frame, stringsAsFactors = FALSE))
library(jsonlite)

url如果
a$seasure\u history
为空(第57页为示例),则执行
data.frame(a[1]、a[20]、a[21]、as.data.frame(a$seasure\u history))
时,前3个元素有一行(它们是标量),最后一个元素没有行。在您的函数中,您可以首先检查是否存在
a$seasure\u历史记录。如果不是,您可以在其位置创建一行
NA
s

但是,您的代码还有一个问题,您可能还没有意识到。并非696的每个页面都存在,当您试图从中提取数据时,会出现404错误。在执行最后的
do.call(rbind,…)
步骤之前,我添加了一些步骤来删除这些页面

library(jsonlite)
url <- "http://fantasy.premierleague.com/web/api/elements/"
seasonsdata <- data.frame(matrix(NA, nrow = 1, ncol = 20))
seasonsdata <- seasonsdata[-1, ]
fetchData <- function(i) {
  res <- try(a <- fromJSON(paste0(url, i)))
  if (!inherits(res, "try-error")) {
    if (nrow(as.data.frame(a$season_history)) == 0) {
      b <- data.frame(a[1], a[20], a[21], as.data.frame(matrix(NA, ncol = 17)))
    } else {
      b <- data.frame(a[1], a[20], a[21], as.data.frame(a$season_history))
    }
  }
}

seasonsdata <- lapply(1:696, fetchData)
seasonsdata <- seasonsdata[!sapply(seasonsdata, is.null)]
seasonsdata <- seasonsdata[sapply(seasonsdata, is.data.frame)]
seasonsdata <- do.call(rbind,lapply(seasonsdata, data.frame, stringsAsFactors = FALSE))
library(jsonlite)

url检查
a[1]
a[20]
a[21]
as.data.frame(a$seasonhistory)
中的行数。它们需要相同才能创建数据帧。看起来您可能需要添加一行代码以在必要时插入
NA
s。您能帮我更正代码吗?请检查
a[1]
a[20]
a[21]
as.data.frame(a$seasurehistory)
中的行数。它们需要相同才能创建数据帧。看起来您可能需要添加一行代码,以便在必要时插入
NA
s。您能帮我更正代码吗?
library(jsonlite)
url <- "http://fantasy.premierleague.com/web/api/elements/"
seasonsdata <- data.frame(matrix(NA, nrow = 1, ncol = 20))
seasonsdata <- seasonsdata[-1, ]
fetchData <- function(i) {
  res <- try(a <- fromJSON(paste0(url, i)))
  if (!inherits(res, "try-error")) {
    if (nrow(as.data.frame(a$season_history)) == 0) {
      b <- data.frame(a[1], a[20], a[21], as.data.frame(matrix(NA, ncol = 17)))
    } else {
      b <- data.frame(a[1], a[20], a[21], as.data.frame(a$season_history))
    }
  }
}

seasonsdata <- lapply(1:696, fetchData)
seasonsdata <- seasonsdata[!sapply(seasonsdata, is.null)]
seasonsdata <- seasonsdata[sapply(seasonsdata, is.data.frame)]
seasonsdata <- do.call(rbind,lapply(seasonsdata, data.frame, stringsAsFactors = FALSE))