使用rvest将数据从web拖放到数据帧中

使用rvest将数据从web拖放到数据帧中,r,web-scraping,rvest,R,Web Scraping,Rvest,我有一个关于将网页中的数据刮到数据框中的问题……我有一个脚本,虽然可以工作,但可以改进,我正在努力实现我想要的改进 在谷歌搜索和阅读StackOverflow资料的帮助下,我制作了一个脚本,使用许可证号码列表从EPA网站获取NPDES SIC代码数据 library(rvest) library(tidyverse) # Start with permit number list permitlist <- list("DC0000175", "VA0076384", "VA0021

我有一个关于将网页中的数据刮到数据框中的问题……我有一个脚本,虽然可以工作,但可以改进,我正在努力实现我想要的改进

在谷歌搜索和阅读StackOverflow资料的帮助下,我制作了一个脚本,使用许可证号码列表从EPA网站获取NPDES SIC代码数据

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)
  }

我想编辑脚本,以便dataframe包含一列许可证编号。另外,一些许可证号码有不止一个NPDES SIC代码(例如:DC0000175 at有两个NPDES SIC代码),但我只能获得获取第一个SIC代码的脚本

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


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

我已经努力工作了一段时间,希望能得到任何帮助。

做两个改变:

  • 使用
    c()
    将permitlist从列表更改为向量-这也使它运行得更快
  • 将新列添加到
    数据中
    df并指定相应的许可值
库(rvest)
图书馆(tidyverse)
#从许可证号码列表开始
#向量更有效,更容易实现
许可列表进行两项更改:

  • 使用
    c()
    将permitlist从列表更改为向量-这也使它运行得更快
  • 将新列添加到
    数据中
    df并指定相应的许可值
库(rvest)
图书馆(tidyverse)
#从许可证号码列表开始
#向量更有效,更容易实现

许可列表谢谢,矢量确实有助于加快速度!我仍然希望脚本将许可证的所有SIC代码作为一个单独的行返回,而不仅仅是第一个代码,但我认为我可能可以进行第二个循环,使用
(grep(^NPDES\n),tbl[[j]],value=TRUE)[2])
,然后组合数据帧。哦,很抱歉,我没有注意到这一点,因此从每个url获得所有结果。有更新的代码,在第一个中间的一个新的for循环将遍历每个URL的所有结果。同样,您可以在第一个循环中更改
data
定义中的列名。希望有帮助!谢谢,矢量确实有助于加快速度!我仍然希望脚本将许可证的所有SIC代码作为一个单独的行返回,而不仅仅是第一个代码,但我认为我可能可以进行第二个循环,使用
(grep(^NPDES\n),tbl[[j]],value=TRUE)[2])
,然后组合数据帧。哦,很抱歉,我没有注意到这一点,因此从每个url获得所有结果。有更新的代码,在第一个中间的一个新的for循环将遍历每个URL的所有结果。同样,您可以在第一个循环中更改
data
定义中的列名。希望有帮助!

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