2013-06-30 56 views
1

我想從幾個姐姐網址上抓取數據進行分析。先前的線程Scraping a web page, links on a page, and forming a table with R是讓我在正確的道路上與下面的腳本有所幫助:在R中刮相關頁面

rm(list=ls()) 
library(XML) 
library(RCurl) 

#=======2013======================================================================== 
url2013 = 'http://www.who.int/csr/don/archive/year/2013/en/index.html' 
doc <- htmlParse(url2013) 
dummy2013 <- data.frame(
    dates = xpathSApply(doc, '//*[@class="auto_archive"]/li/a', xmlValue), 
    hrefs = xpathSApply(doc, '//*[@class="auto_archive"]/li/a', xmlGetAttr,'href'), 
    title = xpathSApply(doc, '//*[@class="link_info"]/text()', xmlValue) 
) 

dummy2013$text = unlist(lapply(dummy2013$hrefs,function(x) 
{ 
    url.story <- gsub('/entity','http://www.who.int',x) 
    texts <- xpathSApply(htmlParse(url.story), 
         '//*[@id="primary"]',xmlValue) 
})) 

dummy2013$link <- gsub('/entity','http://www.who.int',dummy2013$hrefs) 

write.csv(dummy2013, "whoDON2013.csv") 

然而,應用到姐姐的URL,事情打破。試圖

#=======2011======================================================================== 
url2011 = 'http://www.who.int/csr/don/archive/year/2011/en/index.html' 
doc <- htmlParse(url2011) 
dummy2011 <- data.frame(
    dates = xpathSApply(doc, '//*[@class="auto_archive"]/li/a', xmlValue), 
    hrefs = xpathSApply(doc, '//*[@class="auto_archive"]/li/a', xmlGetAttr,'href'), 
    title = xpathSApply(doc, '//*[@class="link_info"]/text()', xmlValue) 
) 

例如,產生用於http://www.who.int/csr/don/archive/year/2008/en/index.htmlhttp://www.who.int/csr/don/archive/year/2006/en/index.html發生

## Error in data.frame(dates = xpathSApply(doc, "//*[@class=\"auto_archive\"]/li/a", : 
    arguments imply differing number of rows: 59, 60 

類似的錯誤。我對HTML或XML不太方便;任何想法讚賞。

+0

我想這個錯誤是因爲你有多個故事的日期。腳本假定你有一對一的關係story-> date。 – agstudy

+1

你可能會利用這些故事全部分組在'

  • '上來捕獲這些重複的「link_info」。 – Thomas

    +0

    謝謝,雖然我不清楚重複日期是否是問題 - 這個腳本適用於2012年(http://www.who.int/csr/don/archive/year/2011/en/index.html ),例如,併成功地刮擦了11月23日發生的三個故事。 – user2535366

    回答

    1

    您可以選擇標題第一然後找到與之相關的HREF

    require(XML) 
    url2011 = 'http://www.who.int/csr/don/archive/year/2011/en/index.html' 
    doc <- htmlParse(url2011) 
    titleNodes <- getNodeSet(doc, '//*[@class="link_info"]') 
    hrefNodes <- sapply(titleNodes, getNodeSet, path = './preceding-sibling::a') 
    
    dummy2011 <- data.frame(
        dates = sapply(hrefNodes, xmlValue), 
        hrefs = sapply(hrefNodes, xmlAttrs), 
        title = sapply(titleNodes, xmlValue), 
        stringsAsFactors = FALSE 
    ) 
    

    UPDATE:

    刪除重複值,你可以使用

    dummy2011 <- dummy2011[!duplicated(dummy2011$hrefs),] 
    
    +0

    謝謝,我會試試這個! – user2535366

    +0

    @ user2535366 +1!好主意使用前面的值,也許你可以添加結果的長度... – agstudy

    +0

    後者的解決方案當然是最好的。謝謝! – user2535366

    0

    在更仔細地看後有問題的HTML代碼我發現了一些不一致,絆倒了我正在使用的腳本。根據記錄,以下作品(不可否認的難看和特設十歲上下的 - 但它能夠完成任務):

    #=======2011======================================================================== 
    url2011 = 'http://www.who.int/csr/don/archive/year/2011/en/index.html' 
    doc <- htmlParse(url2011) 
    
    dates = xpathSApply(doc, '//*[@class="auto_archive"]/li/a',xmlValue) 
    hrefs = xpathSApply(doc, '//*[@class="auto_archive"]/li/a',xmlGetAttr,'href') 
    title = xpathSApply(doc, '//*[@class="link_info"]/text()' ,xmlValue) 
    title[5] <- "Influenza like illness in the United States of America Revised 7 December 2011" 
    title = title[-6] 
    
    dummy2011 <- data.frame(
        dates, 
        hrefs, 
        title 
    ) 
    

    謝謝那些誰跳下去幫我看透我的方式,它更讚賞。

    +0

    我已經爲解決您的需求添加了一個更新。 – user1609452

    +0

    @ user2535366我認爲使用/嘗試user1609452解決方案(他的最後編輯)更好,更安全,也許您可​​以接受他的解決方案.. – agstudy