如何从网上下载数据?如果数据不存在,则需要跳过并转到下一个项目

时间:2015-12-23 15:50:49

标签: r csv

我正在尝试修改我在网上找到的脚本。如果没有找到结果,我想让脚本跳过一个自动收报机,有点像Try ... Catch。现在,如果找不到代码,代码就会掉下来。我怎样才能让它跳过任何/所有缺失的代码并完成而不会崩溃?

require(XML)
require(plyr)

getKeyStats_xpath <- function(symbol) {
  yahoo.URL <- "http://finance.yahoo.com/q/ks?s="
  html_text <- htmlParse(paste(yahoo.URL, symbol, sep = ""), encoding="UTF-8")

  #search for <td> nodes anywhere that have class 'yfnc_tablehead1'
  nodes <- getNodeSet(html_text, "/*//td[@class='yfnc_tablehead1']")

  if(length(nodes) > 0 ) {
    measures <- sapply(nodes, xmlValue)

    #Clean up the column name
    measures <- gsub(" *[0-9]*:", "", gsub(" \\(.*?\\)[0-9]*:","", measures))   

    #Remove dups
    dups <- which(duplicated(measures))
    #print(dups) 
    for(i in 1:length(dups)) 
      measures[dups[i]] = paste(measures[dups[i]], i, sep=" ")

    #use siblings function to get value
    values <- sapply(nodes, function(x)  xmlValue(getSibling(x)))

    df <- data.frame(t(values))
    colnames(df) <- measures
    return(df)
  } else {
    break
  }
}

setwd("C:/Users/rshuell001/Desktop/downloads/")

tickers <- c("OREX",
"OSIR",
"PACB",
"PCRX",
"PCYC",
"PDLI",
"PETX",
"PGNX",
"POZN",
"PRTA",
"PTCT",
"PTLA",
"PTX",
"QGEN",
"QLTI",
"RARE",
"RCPT",
"RDUS",
"REGN",
"RGEN",
"RGLS",
"RLYP",
"RPTP",
"RTRX",
"RVNC",
"SAGE")

stats <- ldply(tickers, getKeyStats_xpath)
rownames(stats) <- tickers
write.csv(t(stats), "FinancialStats_updated.csv",row.names=TRUE)

我大约一个星期前在这里发布了,有几个人建议我试试这个。

stats <- llply(tickers, function(t) tryCatch(getKeyStats_xpath(t), error=function(x) {cat("error occurred, skipping this ticker\n")}))
rownames(stats) <- tickers
write.csv(t(stats), "FinancialStats_updated.csv",row.names=TRUE)

从未奏效。我搞砸了一段时间,但无法将数据写入CSV文件。虽然,代码看起来非常接近我想要的。

有人可以帮助我理顺吗? 谢谢!

1 个答案:

答案 0 :(得分:0)

以下是您的代码产生的错误:

  

FUN(X [[i]],...)中的错误:

     

没有循环中断/下一步,跳到顶级

让我们看一下help(break)

  

打破for,while或repeat循环;控制转移到最内层循环之外的第一个语句

所以,break()只能在for,while或repeat循环中使用,并且你在if else语句中使用它...我们可以用getKeyStats_xpath替换那个中断其他。再加上一些标记,表示没有找到符号。

...
  } else {
    cat("Could not find",symbol,"\n")
    return(data.frame(NA))
  }
...

现在工作正常。使用以下命令为统计信息指定名称后,可以删除所有NA的行:

stats <- stats[!rowSums(is.na(stats)) == length(stats),]