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

如何修改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

关键修改说明

  1. 参数升级:extract_text函数参数改为字符串向量start_strs和end_strs,支持传入任意数量的匹配文本
  2. 匹配逻辑优化:
    • 用grepl结合paste0(..., collapse="|")实现多字符串模糊匹配
    • 自动选取最早出现的起始位置,避免多起始字符串时的混乱
    • 仅筛选起始位置之后的终止字符串,确保提取区间有效性
  3. 容错处理:未找到有效起始/终止时返回NA,避免循环中断
  4. 变量修正:原代码中ECBtitles等变量的覆盖问题已修正为列表索引赋值ECB_titles[[i]]

内容的提问来源于stack exchange,提问作者Alexandra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 17:42:47