0

我正在使用网站http://www.crowdrise.com/CDISkoll

考虑我制作的以下 R 代码:

library("RCurl")
library("XML")
library("stringr")

user.address<-"http://www.crowdrise.com/CDISkoll"                     
user.url<-getURL(user.address)       
html <- htmlTreeParse(user.url, useInternalNodes = TRUE)

if(!is.null(xpathSApply(html,
   '//div[@class="grid1-4"]//p[@class="progressText"]',xmlValue))){
       website.goal.percentage<-
               do.call("paste",as.list(xpathSApply(html,
                '//div[@class="grid1-4"]//p[@class="progressText"]',xmlValue)))
} 

if(is.null(xpathSApply(html,
  '//div[@class="grid1-4"]//p[@class="progressText"]',xmlValue))){
          website.goal.percentage<-"Not Available"
}

现在我上面提到的网站不包含任何有关 xpath 的信息 //div[@class="grid1-4"]//p[@class="progressText"]。因此我的变量website.goal.percentage应该是字符串"Not Available"。但是当我在 R 上执行代码时,它website.goal.percentage 返回character(0)....

为什么 R 不存储"Not Available"到变量website.goal.percentage中,我该如何解决?

4

1 回答 1

1

这很容易诊断,您应该看到xpathSApply这里返回一个空列表,以及 R 认为它is.null(list())FALSE. 相反,您应该检查length(...) == 0.

我还建议您使用xpathApply,因为它会系统地返回一个列表。最后,看看如果您使用变量,您的代码如何看起来更好:

nodes <- xpathApply(html, '//div[@class="grid1-4"]//p[@class="progressText"]',
                    xmlValue)

website.goal.percentage <- if(length(nodes) == 0) "Not Available" else
                           do.call("paste", nodes)
于 2013-10-19T21:56:04.237 回答