如何从链接列表中抓取HTML表格

3

我正在尝试使用XML包爬取一些表格数据(选举数据)。在浏览SO时,我发现了如何使用以下方法爬取单个url:

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函数和一些调整)获得一个包含所有我想要爬取的网址的向量。就像这样:

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 = "" 
)

我想创建一个函数,可以在所有的网址上运行readHTMLTable函数,并将结果存储在向量或数据框中(无论是一个还是多个都可以,哪个更容易)。我对R比较陌生,特别是对于函数不太熟悉。我尝试了一些代码,类似于...
tabla<- for (i in urls){
        readHTMLTable(urls)
        }

但实际上并不接近。

2个回答

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)]])
})

勾选小勾勾,给Hong Ooi一些积分,这样就会标记此问题已回答... - Spacedman
好的,我已经将答案标记为已接受。可惜我暂时无法给予Hong Ooi积分,因为我自己需要15个积分才能进行评分 :( 谢谢 - Federico C

2

这里有另一种使用 plyr 包的方法。请注意,此解决方案会自动从页面提取您感兴趣的链接列表,然后迭代这些链接,收集您感兴趣的所有表格。

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')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接