Как вычеркнуть HTML-таблицы из списка ссылок - PullRequest
3 голосов
/ 28 октября 2011

Я пытаюсь очистить некоторые таблицы (данные о выборах) с помощью пакета 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 = "" 
)

Я хотел бы создать функцию, которая выполняет функцию readHTMLTable во всех URL-адресах, и сохранить результаты в векторе или во фрейме данных (в одном или нескольких, независимо от того, чтоэто легче).Я совсем новичок в R, и я особенно плохо разбираюсь в функциях.Я пробовал что-то вроде ...

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

... но это даже не близко.

Ответы [ 2 ]

3 голосов
/ 28 октября 2011

Самый базовый подход, использующий цикл. Это просто оборачивает код, который вы указали внутри 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)]])
})
2 голосов
/ 29 октября 2011

Вот еще один подход с использованием пакета 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')
...