2011-10-28 68 views
3

我試圖使用XML包提取一些表格(選舉數據)。瀏覽SO,我發現如何使用一個URL:如何從鏈接列表中刪除HTML表格

library(XML) 
url <- "http://www.elecciones2011.gob.ar/paginas/paginas/dat99/DPR99999A.htm" 
total <- readHTMLTable(url) 
n.rows <- unlist(lapply(total, function(t) dim(t)[1])) 
df<-as.data.frame(total[[which.max(n.rows)]]) 

通過上面的代碼,我得到了足夠好的結果。我也可以(使用readLines函數和一些調整)來獲取我想要抓取的所有URL的矢量。就像這樣:

base_url <- "http://www.elecciones2011.gob.ar/paginas/paginas/" 
urls <- paste(
    base_url, 
    c(
    "dat02/DPR02999A", 
    "dat03/DPR03999A", 
    "dat04/DPR04999A", 
    "dat05/DPR05999A", 
    "dat06/DPR06999A", 
    "dat07/DPR07999A", 
    "dat08/DPR08999A", 
    "dat09/DPR09999A", 
    "dat10/DPR10999A", 
    "dat11/DPR11999A", 
    "dat12/DPR12999A", 
    "dat13/DPR13999A", 
    "dat14/DPR14999A", 
    "dat15/DPR15999A", 
    "dat16/DPR16999A", 
    "dat17/DPR17999A", 
    "dat18/DPR18999A", 
    "dat19/DPR19999A", 
    "dat20/DPR20999A", 
    "dat21/DPR21999A", 
    "dat22/DPR22999A", 
    "dat23/DPR23999A", 
    "dat24/DPR24999A" 
), 
    ".htm", 
    sep = "" 
) 

我想要做的是在一個或多個創建運行在所有URL的readHTMLTable功能的功能,並存儲在一個向量或數據幀的結果(,無論是更容易)。我對R很新,而且我在功能上特別糟糕。我試過類似...

tabla<- for (i in urls){ 
     readHTMLTable(urls) 
     } 

...但它甚至不是很接近。

回答

3

最基本的方法,使用循環。這僅包含您在for內提供的代碼。

tabla <- list() 
for(i in seq_along(urls)) 
{ 
    total <- readHTMLTable(urls[i]) 
    n.rows <- unlist(lapply(total, function(t) dim(t)[1])) 
    tabla[[i]] <- as.data.frame(total[[which.max(n.rows)]]) 
} 

更優雅的方法,使用lapply。現在,提供的代碼被放入一個函數中,每個url都被調用。

tabla <- lapply(urls, function(url) { 
    total <- readHTMLTable(url) 
    n.rows <- unlist(lapply(total, function(t) dim(t)[1])) 
    as.data.frame(total[[which.max(n.rows)]]) 
}) 
+0

非常感謝,非常感謝! –

+0

打勾小勾,給洪Ooi一些點,這將標記此答案爲答案.... – Spacedman

+0

在那裏,我標記的答案被接受。我不能給Hong Ooi點,我需要15點的聲望:(謝謝 –

2

下面是使用plyr package.Note另一種方法,這種解決方案能夠自動提取的您有興趣從頁面,然後通過這些鏈接收集所有你感興趣的表遍歷鏈接列表。

library(XML); library(plyr) 

# PARSE WEBPAGE INTO DOC 
url <- "http://www.elecciones2011.gob.ar/paginas/paginas/dat99/DPR99999A.htm" 
doc <- htmlParse(url) 

# EXTRACT LINKS OF INTEREST AND CREATE ABSOLUTE PATHS 
links <- xpathSApply(doc, "//div[@id = 'divindex']//a", xmlGetAttr, 'href') 
links <- gsub("..", 'http://www.elecciones2011.gob.ar/paginas/paginas', links, 
    fixed = T) 

# EXTRACT TABLES OF INTEREST FROM LINKS 
tables = llply(links, function(l) readHTMLTable(l)[[3]], .progress = 'text')