当前位置: 首页 > 知识库问答 >
问题:

使用rvest将数据从web刮到dataframe

龙永逸
2023-03-14
library(rvest)
library(tidyverse)

# Start with permit number list 

permitlist <- list("DC0000175", "VA0076384", "VA0021318")

# For each permit number, create a URL list that leads to the EPA site associated with that permit

urls <- list()
for(i in 1:length(permitlist)) {
  url <- paste0("https://iaspub.epa.gov/enviro/fii_query_dtl.disp_program_facility?pgm_sys_id_in=", permitlist[i], "&pgm_sys_acrnm_in=NPDES")
urls[i] <- url
} 

# Open each URL and scrape SIC code data

complete<-data.frame()
tbl <- list()

for (j in seq_along(urls)) {
  data <- tbl[[j]] <- urls[[j]] %>%  
    read_html() %>% 
    html_nodes("tr") %>%
    html_text()
  data <- unlist(strsplit(trimws(grep("^NPDES\n", tbl[[j]], value=TRUE)[1]), "\n", perl=TRUE))
  complete <-rbind(complete,data, stringsAsFactors = FALSE)
  }


1    NPDES    3273                READY-MIXED CONCRETE
2    NPDES    3714                MOTOR VEHICLE PARTS AND ACCESSORIES
3    NPDES    4952                SEWERAGE SYSTEMS

# (Row number, type of permit (all will be NPDES), NPDES SIC code, and description.)

理想情况下,我的最终数据帧将如下所示:


1    NPDES    3273    DC0000175  READY-MIXED CONCRETE
2    NPDES    1611    DC0000175  HIGHWAY AND STREET CONSTRUCTION, EXCEPT ELEVATED HIGHWAYS
3    NPDES    3714    VA0076384  MOTOR VEHICLE PARTS AND ACCESSORIES
4    NPDES    4952    VA0021318  SEWERAGE SYSTEMS

我已经挣扎了一段时间,现在让这个工作,并将感谢任何帮助。

共有1个答案

云瑞
2023-03-14

进行两项更改:

  • 使用c()将permitlist从列表更改为向量-这也使它运行得更快!
  • 数据df添加新列,并分配相应的许可值
library(rvest)
library(tidyverse)

# Start with permit number list 

# vector is more efficient and more easily iterable
permitlist <- c("DC0000175", "VA0076384", "VA0021318")

# For each permit number, create a URL list that leads to the EPA site associated with that permit

urls <- list()
for(i in 1:length(permitlist)) {
  url <- paste0("https://iaspub.epa.gov/enviro/fii_query_dtl.disp_program_facility?pgm_sys_id_in=", permitlist[i], "&pgm_sys_acrnm_in=NPDES")
  urls[i] <- url
} 

# Open each URL and scrape SIC code data

complete<-data.frame()
tbl <- list()

for (j in seq_along(urls)) {
  tbl[[j]] <- urls[[j]] %>%  
    read_html() %>% 
    html_nodes("tr") %>%
    html_text()

  data <- data.frame(A = NA, B = NA, c = NA, permit = NA)
  a <- grep("^NPDES\n", tbl[[j]], value=TRUE)

  for(k in seq_along(a)){
  dt <- unlist(strsplit(trimws(a[k]), "\n", perl=TRUE))
  dt <- c(dt, permitlist[j])
  data[k,] <- dt
  }
  complete <- bind_rows(complete, data)

}

complete

通过在填充表之前指定列名(a,B,C,permit),编辑使输出数据帧更整齐。

 类似资料:
  • 我在下面提供了一些示例,但是我需要清除大部分可用的数据元素,所以不是寻找复制和粘贴的代码,而是寻找最好的方法。见下文。 链接:https://boardgamegeek.com/boardgame/63888/innovation 我试图从中提取的HTML示例。Span没有返回html_nodes,所以我无法从那里开始。 我假设这是JSON?有没有一种方法来解析html_text输出,或者另一种方

  • 我正在从一个站点上刮取数据,每个项目都有一个相关的文档URL。我想从那个文件中刮数据,这是可用的HTML格式后点击链接。现在,我一直在使用Google Sheets导入feed来填充基本列。 有没有下一步,我可以做的,进入每个相应的URL并从文档中抓取元素,并用它们填充Google表单?我之所以使用RSS提要(而不是python和BS)是因为它们实际上提供了一个RSS提要。 我找过了,没有找到一个

  • 我正在尝试刮网页,在那里我需要解码整个表到一个数据帧。我正为此使用漂亮的汤。在某些标记中,有一些标记没有任何文本。但这些值会显示在网页上的特定span标记中。 下面的代码对应于该网页, 但是,这个标记中显示的值是。我试着删掉它,但我收到的是空短信。 如何刮这个价值使用美丽的汤。 URL:https://en.tutiempo.net/climate/ws-432950.html 下面给出了我的用于

  • 问题内容: 如何使用XML包抓取html表? 维基百科页面为例。我想在R中阅读它,并获得“巴西与国际足联认可的球队进行的所有比赛的清单”表作为data.frame。我怎样才能做到这一点? 问题答案: …或更短的尝试: 选择的表是页面上最长的表

  • 我试图使用Selenium从代码中获得jpg。我已经设法找到了链接点击获得我的jpg所在的位置。(真倒霉!我刚接触硒)。所有的窗户都随着它的点击而打开。与刮刮乐相比,它真的很慢,所以如果有人能告诉我一个更快的方法,那就太好了。 我试图搜索的网站是www.rosegal.com。我正在刮的类别是大尺寸的背心。这第一页有60个产品在它。如果单击这些产品,它会将您带到一个产品页面,在该页面上您可以选择所