如何用R语言结合正则从EPA网页提取NPDES SIC代码及描述?
解决R语言提取EPA页面NPDES SIC代码的正则问题
嘿,我帮你搞定这个提取问题!你之前的正则出错是因为没先筛选出目标行,导致匹配到了页面里其他地方的四位数字,咱们一步步来修正:
问题根源
你用as.numeric(sub(".*?NPDES.*?(\\d{4}).*", "\\1", test))得到错误结果,是因为test是页面所有<tr>标签的文本向量,里面不止包含你要的那一行——正则会匹配整个向量中第一个符合NPDES后接四位数字的内容,而这个内容可能来自其他无关行,自然就拿到了错误的数字。
解决方案:先定位目标行,再提取内容
咱们先精准拿到包含NPDES SIC的那一行,再拆分提取代码和描述,有两种常用方法:
方法1:用rvest+stringr(更简洁)
library(rvest) library(stringr) # 读取目标页面 page <- read_html("https://iaspub.epa.gov/enviro/fii_query_dtl.disp_program_facility?pgm_sys_id_in=MDG766216&pgm_sys_acrnm_in=NPDES") # 直接定位到包含"NPDES"的表格行 target_row <- page %>% html_nodes("tr:contains('NPDES')") %>% html_text() # 按换行符拆分内容,过滤掉空字符串 row_parts <- str_split(target_row, "\\n")[[1]] %>% keep(. != "") # 提取SIC代码和描述,组合成目标格式 sic_code <- row_parts[2] sic_desc <- str_to_title(row_parts[3]) # 可选:转标题大小写,不需要就去掉 final_result <- paste(sic_code, sic_desc) print(final_result) # 输出:"6515 Operators Of Residential Mobile Home Sites"
方法2:只用base R(无需额外包)
library(rvest) # 读取页面并获取所有tr文本 test <- read_html("https://iaspub.epa.gov/enviro/fii_query_dtl.disp_program_facility?pgm_sys_id_in=MDG766216&pgm_sys_acrnm_in=NPDES") %>% html_nodes("tr") %>% html_text() # 筛选出包含"NPDES"的目标行 target_line <- test[grepl("NPDES", test)] # 提取四位SIC代码 sic_code <- regmatches(target_line, regexpr("\\d{4}", target_line)) # 提取描述:去掉开头的NPDES+代码部分,以及末尾的空白 sic_desc <- gsub("^NPDES\\n\\d{4}\\n|\\s*$", "", target_line) # 组合结果 final_result <- paste(sic_code, sic_desc) print(final_result) # 输出:"6515 OPERATORS OF RESIDENTIAL MOBILE HOME SITES"
关键要点
- 先筛选目标行:一定要先把包含"NPDES"的行单独提取出来,避免其他行的无关数字干扰正则匹配。
- 精准拆分/匹配:利用换行符拆分内容,或者用
\\d{4}精准匹配四位SIC代码,都能高效拿到你要的信息。
内容的提问来源于stack exchange,提问作者happymappy
相关产品推荐
相关产品推荐

