我正在使用XML
软件包来抓取网站列表。具体来说,我正在以下网站上的候选人名单中进行评分:votesmart。
候选人的页面按数字顺序排列,从1开始。我的第一次尝试,刮掉前50名候选人,看起来像这样
library(xml)
library(plyr)
url <- paste("http://www.votesmart.org/candidate/evaluations/", 1:50 , sep = "")
res <- llply(url, function(i) readHTMLtable(i))
但是有一些问题 - 例如,此序列中的第25个page会产生404 "url not found"
错误。我通过首先获得序列中每个页面的XML
错误计数的数据帧,然后排除具有单个错误的页面来解决这个问题。具体地
errors <- ldply(url, function(i) length(getXMLErrors(i)))
url2 <- url[which(errors$V1 > 1)]
res2 <- llply(url2, function(i) readHTMLTable(i))
通过这种方式,我从此列表中排除了生成404的网址。
但是,由于列表中的大量页面导致此llply命令失败,仍然存在问题。以下是一个例子
readHTMLTable("http://www.votesmart.org/candidate/evaluations/6")
导致错误
Error in seq.default(length = max(numEls)) :
length must be non-negative number
In addition: Warning message:
In max(numEls) : no non-missing arguments to max; returning -Inf
但是,这些页面会从getXMLErrors命令生成与工作页面相同的错误计数,因此我无法在此方面区分它们。
我的问题是 - 这个错误是什么意思,有没有办法让readHTMLTable返回这些页面的空列表,而不是错误?如果失败了,有没有办法让我的llply语句检查这些页面并跳过那些导致错误的页面?
答案 0 :(得分:3)
为什么不只是一些简单的错误处理?
res <- llply(url, function(i) try(readHTMLTable(i)))