我正在尝试使用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函数和一些调整)获得一个包含我想要抓取的所有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)
}
......但它甚至都没有。
答案 0 :(得分: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)]])
})
答案 1 :(得分: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')