【问题标题】:Reading numerous html tables into R将大量 html 表读入 R
【发布时间】:2019-08-14 16:03:11
【问题描述】:

我正在尝试将 html 数据表拉入单个数据框中,并且我正在寻找一个优雅的解决方案。有 255 个表,并且 url 因两个变量而异:Year 和 Aldermanic District。我知道一定有办法使用 for 循环或其他东西,但我很难过。

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


    【解决方案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)
    }
    

    【讨论】:

    • 感谢您的回答。这样做的问题是我仍然需要编写所有的 URL——我正在寻找一种自动迭代 URL 的解决方案。
    • @Pecners 我给了你一个选项来生成所有年份和地区的 URL。
    【解决方案2】:

    我们可以使用来自purrr 包(tidyverse 的一部分)包中的map_dfr 来跨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]]) 
    

    【讨论】:

    • 感谢您的回答。多年来一直有效,但地区也有所不同,范围为 1:15(URL 中的“14”)。我可以在 2002 年 2018 年 1 点 15 分的地区使用这种方法吗?
    • 将地区作为第二个参数传递给map2_dfr(arg1, arg2, fun)。在上面的paste 中使用.y 参考它,你就完成了
    猜你喜欢
    • 2012-12-26
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-17
    • 2015-10-22
    • 2012-09-22
    • 1970-01-01
    相关资源
    最近更新 更多