使用rvest将数据从web拖放到数据帧中
我有一个关于将网页中的数据刮到数据框中的问题……我有一个脚本,虽然可以工作,但可以改进,我正在努力实现我想要的改进 在谷歌搜索和阅读StackOverflow资料的帮助下,我制作了一个脚本,使用许可证号码列表从EPA网站获取NPDES SIC代码数据使用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
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
我已经努力工作了一段时间,希望能得到任何帮助。做两个改变:
- 使用
将permitlist从列表更改为向量-这也使它运行得更快李>c()
- 将新列添加到
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