将大量的html表读入R

时间:2019-03-24 03:14:36

标签: r web-scraping xml-parsing

我正在尝试将html数据表拉入单个数据框中,并且正在寻找一种优雅的解决方案。有255个表格,网址有两个变量:Year和Aldermanic District。我知道必须有一种用于循环或其他方法的方法,但是我很困惑。

我已经用一行单独的代码读取了每个表,从而成功导入了数据,但这导致每个表都占一行,并且又有255个表。

library(XML)
data <- bind_rows(readHTMLTable("http://assessments.milwaukee.gov/SalesData/2018_RVS_Dist14.htm", skip.rows=1),
                   readHTMLTable("http://assessments.milwaukee.gov/SalesData/2017_RVS_Dist14.htm", skip.rows=1),
                   readHTMLTable("http://assessments.milwaukee.gov/SalesData/2016_RVS_Dist14.htm", skip.rows=1),
                   readHTMLTable("http://assessments.milwaukee.gov/SalesData/2015_RVS_Dist14.htm", skip.rows=1),

理想情况下,我可以使用for循环之类的东西,这样我就不必为每个表手动编写readHTMLTable函数的代码。

2 个答案:

答案 0 :(得分:1)

您可以尝试创建一个包含所有要抓取的URL的向量,然后使用for循环遍历这些输入:

url1 <- "http://assessments.milwaukee.gov/SalesData/"
url2 <- "_RVS_Dist"
years <- c(2015:2018)
dist <- c(1:15)
urls <- apply(expand.grid(paste0(url1, years), paste0(url2, dist)), 1, paste, collapse="")
data <- NULL
for (url in urls) {
    df <- readHTMLTable(url)
    data <- rbind(data, df)
}

答案 1 :(得分:1)

我们可以使用map_dfr包(purrr的一部分)中的tidyverse在整个URL上应用readHTMLTable函数。关键是要识别与每个URL不同的部分。在这种情况下,2015:2018是唯一更改的内容,因此我们可以使用paste0来构造URL。 map_dfr将自动组合所有数据帧以返回一个组合数据帧。 dat是最终输出。

library(tidyverse)
library(XML)

dat <- map_dfr(2015:2018,
               ~readHTMLTable(paste0("http://assessments.milwaukee.gov/SalesData/",
                                     .x,
                                     "_RVS_Dist14.htm"), skip.rows = 1)[[1]])

更新

这里是扩展年份和数字之间的组合,然后使用map2_dfr下载数据的方法。

url <- expand.grid(Year = 2002:2018, Number = 1:15)

dat <- map2_dfr(url$Year, url$Number,
               ~readHTMLTable(paste0("http://assessments.milwaukee.gov/SalesData/",
                                     .x,
                                     "_RVS_Dist",
                                     .y,
                                     ".htm"), skip.rows = 1)[[1]])