将许多html表读入R中

问题描述 投票:0回答:2

我正在尝试将html数据表拉入单个数据框,我正在寻找一个优雅的解决方案。共有255个表格,网址因两个变量而异:年份和Aldermanic区域。我知道必须有一种方法可以用于循环或其他东西,但我很难过。

我已经通过使用单独的代码行读取每个表来成功导入数据,但这会导致每个表都有一行,而且还有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函数。

r web-scraping xml-parsing
2个回答
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
投票

我们可以使用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]]) 
© www.soinside.com 2019 - 2024. All rights reserved.