如何用R提取20k个HTML文件中‘Principal Risks’后的文本?
批量提取HTML中Principal Risks后的文本方案
核心思路
别纠结复杂的标签嵌套,先把整个HTML转成纯文本,直接定位Principal Risks关键词,再提取后面指定数量的单词——这种方法能绕开标签结构的混乱问题,特别适合处理20000份格式不统一的文件。
具体实现(R语言)
1. 加载依赖工具包
用rvest解析HTML,stringr处理文本,purrr批量处理文件:
library(rvest) library(stringr) library(purrr)
2. 编写单文件处理函数
这个函数输入文件路径,输出提取到的风险文本:
extract_principal_risks <- function(file_path, num_words = 200) { # 读取并解析HTML文件 html_content <- read_html(file_path) # 转成纯文本并清理多余空格 plain_text <- str_squish(html_text(html_content)) # 定位*Principal Risks*的位置(忽略大小写) risk_pos <- str_locate(plain_text, regex("Principal Risks", ignore_case = TRUE))[,2] if (is.na(risk_pos)) { return(NA) # 没找到关键词就返回空值 } # 截取关键词之后的文本内容 post_risk_content <- str_sub(plain_text, start = risk_pos + 1) # 分割成单词,取前指定数量后重新拼接 word_list <- str_split(post_risk_content, "\\s+")[[1]] if (length(word_list) > num_words) { word_list <- word_list[1:num_words] } paste(word_list, collapse = " ") }
3. 批量处理所有HTML文件
批量遍历目标文件夹里的HTML,把结果保存成CSV方便后续查看:
# 替换成你的HTML文件所在文件夹路径 html_files <- list.files(path = "your/html/folder/path", pattern = "\\.html$", full.names = TRUE) # 批量提取,num_words可按需调整(比如改成500提取更多内容) risk_results <- map(html_files, extract_principal_risks, num_words = 200) # 转成数据框格式 result_table <- data.frame( 文件名 = basename(html_files), 风险文本 = unlist(risk_results) ) # 保存结果到CSV write.csv(result_table, "principal_risks_results.csv", row.names = FALSE, fileEncoding = "UTF-8")
额外提示
- 纯文本方案的优势是不管内容被拆在多少个标签里,转成文本后都会连成一片,不会漏掉内容
- 如果想保留段落结构,可以尝试定位包含关键词的节点,再抓取它的后续兄弟节点,但这种方法对HTML结构统一性要求高,不如纯文本方案稳定
内容的提问来源于stack exchange,提问作者osckt
相关产品推荐
相关产品推荐

