我的情况:我有一个很长的(20k行)URL列表,我需要从特定的数据元素中进行分析。出于这个例子的目的,我正在寻找一个名为“sol-num”的特定字段,它是征求号码。使用以下功能,我可以获取FedBizOpps上列出的任何采购的征集号:
require(rvest)
require(magrittr)
fetchSolNum<-function(URL){
URL<-as.character(URL)
solNum<-html(URL)%>%
html_node(".sol-num")%>%
html_text()
}
现在,我有一个包含数千个URL的列表,我想为每个URL提取请求编号,将其存入数据框的新列,我从中获取URL列表。对于您自己的测试,以下是URL列表中的前十行:
list<-c("https://www.fbo.gov/spg/DISA/D4AD/DITCO/HC1028-12-T-0025/listing.html",
"https://www.fbo.gov/notices/c360b067077aabde331d66e0fe2d1f8f",
"https://www.fbo.gov/notices/f63053a7a6e858a5b7b537a660c473b7",
"https://www.fbo.gov/spg/DLA/J3/DSCP-I/SPM300-12-R-0024/listing.html",
"https://www.fbo.gov/spg/DLA/J3/DAPS/SP7000-11-Q-0047/listing.html",
"https://www.fbo.gov/spg/USAF/AFMC/OCALCCC/F3YCDW1245A001/listing.html",
"https://www.fbo.gov/spg/USAF/AFMC/AFFTC/FA9300-12-R-5001/listing.html",
"https://www.fbo.gov/notices/17ddec6ae37feb69704b1a52e22eeb26",
"https://www.fbo.gov/notices/3b76d40705a23a749aad46df88dcee0c",
"https://www.fbo.gov/notices/91873b727968dc664ada76c48e53e4df")
raw <- data.frame(matrix(unlist(list), nrow=10, byrow=T))
我想将输出存储在名为solNum
的数据框中的变量raw
中,所以我的函数现在就是使用循环:
raw$solNum<-0
j=1
for (i in list){
raw$solNum[j]<-fetchSolNum(i)
j=j+1
}
运行代码当前存放前五行的值,然后返回以下错误:
Error in xml_apply(x, XML::xmlValue, ..., .type = character(1)) :
Unknown input of class: NULL
经过进一步调查,我发现问题可能在于列表中的这个URL:https://www.fbo.gov/spg/USAF/AFMC/OCALCCC/F3YCDW1245A001/listing.html会转到某种消歧页面,因为这个URL有两次采购。
考虑到我的完整列表长达20k行,我没有时间浏览并清除所有无效URL的列表。有没有办法让我的当前函数只为URL无效或类似的行插入NA值?我怎样才能让它不破坏这个错误?
另外,阅读时告诉我,将此操作作为矢量化函数而不是循环运行可能更快更有效。任何人都可以提供一些关于我的情况可能会是什么样的提示吗?
答案 0 :(得分:3)
可能只有tryCatch()
可以在这里捕捉错误并给予NA。至于矢量化,我怀疑你会看到任何真正的收益。阅读网站需要一段时间(有时是一两秒)。有了20K,它需要一些时间。绝对查看Hadley关于异常和调试的章节,并在代码中设置一些检查,这样它就不会在运行4小时后爆炸...... http://adv-r.had.co.nz/Exceptions-Debugging.html