如何修改R网络爬虫代码实现多起始/终止字符串匹配?
修改R爬虫代码以支持多起始/终止字符串匹配
核心调整方案
将原有的单字符串匹配逻辑升级为多字符串匹配,同时优化区间选取逻辑,确保在多个匹配项中提取最合理的文本区间。
修改后的完整代码
library(rvest) library(tidyverse) library(mclm) library(tm) url_list <- c("https://www.ecb.europa.eu/press/press_conference/monetary-policy-statement/2024/html/ecb.is240411~9974984b58.en.html","https://www.ecb.europa.eu/press/press_conference/monetary-policy-statement/2024/html/ecb.is240307~314650bd5c.en.html") # 重构后的多字符串匹配提取函数 extract_text <- function(text, start_strs, end_strs) { # 找到所有匹配任意起始字符串的行位置 start_matches <- which(sapply(text, function(line) any(grepl(paste0(start_strs, collapse = "|"), line)))) if (length(start_matches) == 0) return(NA) # 取最早出现的起始位置 start_pos <- min(start_matches) # 找到所有在起始位置之后、匹配任意终止字符串的行位置 end_matches <- which(sapply(text[start_pos:length(text)], function(line) any(grepl(paste0(end_strs, collapse = "|"), line)))) if (length(end_matches) == 0) return(NA) # 转换为全局索引的终止位置 end_pos <- start_pos + min(end_matches) - 1 # 返回区间内的文本 text[start_pos:end_pos] } # 初始化存储列表 ECBstatements <- vector("list", length(url_list)) ECB_dates <- vector("list", length(url_list)) ECB_titles <- vector("list", length(url_list)) # 循环处理每个URL for (i in 1:length(url_list)) { myLink <- url_list[i] Page_ECB <- read_html(myLink) # 提取标题 ECB_titles[[i]] <- Page_ECB %>% html_elements(xpath='//*[contains(concat( " ", @class, " " ), concat( " ", "ecb-pressContentSubtitle", " " ))]') %>% html_text() # 提取日期 ECB_dates[[i]] <- Page_ECB %>% html_elements(xpath = '//*[contains(concat( " ", @class, " " ), concat( " ", "ecb-publicationDate", " " ))]') %>% html_text2() # 提取正文段落 text <- Page_ECB %>% html_nodes('p') %>% html_text2() # 定义多组起始/终止字符串 start_strs <- c("Good afternoon welcome to our press conference.", "Ladies and gentlemen welcome to todays report.", "to our press conference") end_strs <- c("questions.", "Thank you.") # 提取目标文本 extracted_text <- extract_text(text, start_strs, end_strs) ECBstatements[[i]] <- extracted_text } # 查看结果 ECBstatements ECB_dates ECB_titles
关键修改说明
- 参数升级:
extract_text函数参数改为字符串向量start_strs和end_strs,支持传入任意数量的匹配文本 - 匹配逻辑优化:
- 用
grepl结合paste0(..., collapse="|")实现多字符串模糊匹配 - 自动选取最早出现的起始位置,避免多起始字符串时的混乱
- 仅筛选起始位置之后的终止字符串,确保提取区间有效性
- 用
- 容错处理:未找到有效起始/终止时返回NA,避免循环中断
- 变量修正:原代码中
ECBtitles等变量的覆盖问题已修正为列表索引赋值ECB_titles[[i]]
内容的提问来源于stack exchange,提问作者Alexandra
相关产品推荐
相关产品推荐

