【问题标题】:How to scrape HTML tables from a list of links如何从链接列表中抓取 HTML 表格
【发布时间】:2011-10-28 02:04:47
【问题描述】:

我正在尝试使用 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)
        }

...但它甚至不接近。

【问题讨论】:

    标签: r web-scraping


    【解决方案1】:

    最基本的方法,使用循环。这只是将您提供的代码包装在 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 一些分数,这会将这个 Q 标记为已回答......
    • 在那里,我将答案标记为已接受。我还不能给 Hong Ooi 积分,我自己需要 15 分的声望 :( 谢谢
    【解决方案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')
    

    【讨论】:

      猜你喜欢
      • 2017-09-07
      • 2021-01-02
      • 1970-01-01
      • 2021-02-28
      • 2019-08-14
      • 2019-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多