You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 16:45:04