R语言如何移除通配符周边字符 提取HTML中的URL及对应标题
解决方法
你已经写好的匹配规则自带两个捕获组,第一个捕获组对应href属性里的URL,第二个对应链接标题文本,直接提取捕获组内容即可,完全不会损坏URL:
基于你现有逻辑的改进代码
# 输入代码和你的匹配规则保持不变 URL <- "https://www.atf.gov/resource-center/data-statistics" html <- paste(readLines(URL, warn = FALSE)) x <- c('\t\t\t<div><a href=\"([^<]*)\">([^<]*)</a></div>','\t\t</tr><tr><td><a href=\"([^<]*)\">([^<]*)</a></td>','\t\t\t<td><a href=\"([^<]*)\">([^<]*)</a></td>') # 初始化结果数据框 res <- data.frame(Link = character(), Title = character(), stringsAsFactors = FALSE) for (pat in x) { # 匹配符合规则的行 match_rows <- grep(pat, html, value = TRUE) if (length(match_rows) == 0) next # 提取捕获组内容 group_val <- regmatches(match_rows, gregexec(pat, match_rows)) for (item in group_val) { url <- item[2] title <- item[3] # 相对链接补全前缀,不需要可以删除该行 if (!startsWith(url, "http")) url <- paste0("https://www.atf.gov", url) res <- rbind(res, data.frame(Link = url, Title = title)) } } # 去重得到最终结果 res <- unique(res)
运行后得到的res就是你要求的包含Link和Title两列的数据集,和预期输出结构一致。
更稳定的通用方案(不需要手动写匹配规则)
如果不想维护匹配规则,可以用rvest包直接解析DOM提取链接,容错率更高:
library(rvest) page <- read_html("https://www.atf.gov/resource-center/data-statistics") all_a <- html_elements(page, "a") res <- data.frame( Link = html_attr(all_a, "href"), Title = html_text2(all_a) ) # 过滤无效链接即可 res <- res[!is.na(res$Link) & nchar(res$Title) > 0, ]
内容的提问来源于stack exchange,提问作者James R.
相关产品推荐
相关产品推荐

