1

我有一个从 ~ 440 个网页中读取 HTML 表格数据的循环。每个页面上的代码并不完全相同,所以有时我需要表节点 1,有时我需要节点 2。现在我只是在列表中手动设置节点号并将其输入循环。我的问题是页面节点已经开始改变并且更新节点#列表变得很麻烦。

如果循环遇到错误的节点#(即:1 而不是 2,或者相反),它会给出错误并关闭。有没有办法让循环在遇到错误时将错误的节点号替换为正确的节点号,然后继续运行循环,就好像什么都没发生一样?

这是我循环中代码的 readHTML 部分,带有示例 url:

url <- "http://espn.go.com/nba/player/gamelog/_/id/2991280/year/2013/"

html.page <- htmlParse(url)

tableNodes <- getNodeSet(html.page, "//table")

x <- as.numeric(Players$Nodes[s])

tbl = readHTMLTable(tableNodes[[x]], colClasses = c("character"),stringsAsFactors = FALSE)

这是我在节点 # 错误时得到的错误:

"readHTMLTable(tableNodes[[x]], colClasses = c("character"), stringsAsFactors = FALSE) 中的错误:在为函数 'readHTMLTable' 选择方法时评估参数 'doc' 时出错:tableNodes [[x] 中的错误]] : 下标越界"

示例代码:


A <- c("dog", "cat")

Nodes <- as.data.frame(1:1) 

#)Nodes <- as.data.frame(1:2) <-- This works without errors

colnames(Nodes)[1] <- "Col1"

Nodes2 <- 2

url <-c("http://espn.go.com/nba/player/gamelog/_/id/6639/year/2013/","http://espn.go.com/nba/player/gamelog/_/id/6630/year/2013/")

for (i in 1:length(A))  
{ 


html.page <- htmlParse(url[i])

tableNodes <- getNodeSet(html.page, "//table")

x <- as.numeric(Nodes$Col1[i])

df = readHTMLTable(tableNodes[[x]], colClasses = c("character"),stringsAsFactors = FALSE)

#tryCatch(df) here.....no clue


assign(paste0("", A[i]), df)
}
4

1 回答 1

3

如果您收到错误消息,那么您肯定subscript out of bounds应该尝试使用较低的消息。基于您在原始问题中发布的演示代码的x一般演示(尽管我已经替换为我不知道什么是and ):tryCatchx2Playerss

> msg <- tryCatch(readHTMLTable(tableNodes[[2]], colClasses = c("character"),stringsAsFactors = FALSE), error = function(e)e)
> str(msg)
List of 2
 $ message: chr "error in evaluating the argument 'doc' in selecting a method for function 'readHTMLTable': Error in tableNodes[[2]] : subscript"| __truncated__
 $ call   : language readHTMLTable(tableNodes[[2]], colClasses = c("character"), stringsAsFactors = FALSE)
 - attr(*, "class")= chr [1:3] "simpleError" "error" "condition"
> msg$message
[1] "error in evaluating the argument 'doc' in selecting a method for function 'readHTMLTable': Error in tableNodes[[2]] : subscript out of bounds\n"
> grepl('subscript out of bounds', msg$message)
[1] TRUE
于 2013-11-03T18:08:18.450 回答