R:尝试使用unlist(xpathSApply())进行webscrape结果为NULL

时间:2013-10-16 15:01:52

标签: r web web-scraping web-crawler

我正在使用以下网站:http://www.crowdrise.com/skollsechallenge

此页面上有57个众筹广告系列。这些众筹活动中的每一个都有文字详细说明了他们想要筹集资金的原因,到目前为止筹集的资金总额以及团队成员。一些活动还规定了筹款目标。我想写一些R代码,这些代码将从57个站点中的每个站点中抓取并组织这些信息。

为了提供一个包含57家公司中每一家公司所有这些信息的表格,我首先生成的函数可以让我提取57个广告系列中每个广告系列的名称:

  #import packages
  library("RCurl")
  library("XML")
  library("stringr")

  url <- "http://www.crowdrise.com/skollSEchallenge"
  url.data <- readLines(url) 
  #the resulting url.data is a character string
  #remove spaces
  url.data <- gsub('\r','', gsub('\t','', gsub('\n','', url.data)))  
  index.list <- grep("username:",url.data)
  #index.list is a list of integers that indicates indexes of url.data that includes name      
  #of each of the 57 campaigns  
  length.index.list<-length(index.list)
  length.index.list
  vec <-vector ()

  #store the 57 usernames in one vector
    for(i in 1:length.index.list){
      username<-url.data[index.list[i]]
      real.username <- gsub("username:","",username)
      vec[i] <- c(real.username)
    }

然后我尝试制作循环以允许R访问57个广告系列网页中的每一个,然后进行网页抓取。

 # Extract all necessary paragraphs. Unlist flattens the list to 
 #create a character vector.

    for(i in 1:length(vec)){
    end.name<-gsub('\'','',vec[i])
    end.name<-gsub(',','',end.name)
    end.name<-gsub(' ','',end.name)
    user.address<-paste(c("http://www.crowdrise.com/skollSEchallenge/",
    end.name),collapse='') 
    user.url<-getURL(user.address)

    html <- htmlTreeParse(user.url, useInternalNodes = TRUE)
    website.donor<-unlist(xpathSApply(html,'//div[@class="grid1-4 "]//h4', xmlValue))
    website.title<-unlist(xpathSApply(html,'//div[@class="project_info"]',xmlValue))
    website.story<-unlist(xpathSApply(html,'//div[@id="thestory"]',xmlValue))
    website.fund<-unlist(xpathSApply(html,'//div[@class="clearfix"]',xmlValue))

    #(NOTE: doc.text<- readHTMLTable(webpage1) doesn't work 
    #due to the poor html structure of the website)
    # Replace all \n by spaces, and eliminate all \t
    website.donor <- gsub('\\n', ' ', website.donor)
    website.donor <- gsub('\\t','',website.donor)
    website.title <- gsub('\\n', ' ', website.title)
    website.title <- gsub('\\t','',website.title)
    website.story <- gsub('\\n', ' ', website.story)
    website.story <- gsub('\\t','',website.story)
    website.fund <- gsub('\\n', ' ', website.fund)
    website.fund <- gsub('\\t','',website.fund)

    ## all those tabs and spaces are just white spaces that we can trim
    website.title <- str_trim(website.title)
    website.fund   <- str_trim(website.fund)
    website.data<- cbind(website.title, website.story, website.fund, website.donor)
    data[[i]]<- website.data
    Sys.sleep(1)
   }
  data <- data.frame(do.call(rbind,data), stringAsFactors=F)

命令

   unlist(xpathSApply(html,'//div[@class="grid1-4 "]//h4', xmlValue))
   unlist(xpathSApply(html,'//div[@class="project_info"]',xmlValue))
   unlist(xpathSApply(html,'//div[@id="thestory"]',xmlValue))
   unlist(xpathSApply(html,'//div[@class="clearfix"]',xmlValue))

给我NULL值,我不明白为什么。

为什么它们变成NULL,我该如何解决?

谢谢,

2 个答案:

答案 0 :(得分:1)

如果我正确地遵循此规则,您正试图获取此网址字符串以及其他56个字符串?

url <- "http://www.crowdrise.com/skollSEchallenge/Arzu"
x <- getURL(url)

但是,这只会返回您要查询的“找不到页面”页面。我想你想要这个网址,但我甚至无法让htmlParse工作。

url <- "http://www.crowdrise.com/Arzu"
x <- readLines(url, encoding="latin1")
 #doc <- htmlParse(x)  # hangs 

如果您使用http://validator.w3.org和latin1编码检查网站,则会发现323错误,因此您可能需要解析readLines的输出

x[grep('"thestory"', x)+1]
[1] "\t\t\t<p><p><em><strong>&quot;We can overcome misunderstanding by ...

答案 1 :(得分:0)

很高兴你对Crowdrise感兴趣。我们提供的API可能比自动抓取我们的网站要好得多。使用我们的联系表格与我们取得联系或直接给我发消息,我们将讨论您的需求以及我们如何为您提供帮助。

谢谢!

戴夫