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

如何从含换行的HTML中提取<h2>标题文本?R正则问题求助

解决HTML中h2标题提取的正则问题

问题分析

你当前的正则存在两个核心问题:

  1. 贪婪匹配:.*会从第一个&lt;/span&gt;匹配到最后一个&lt;/h,导致多匹配场景下跳过中间的标题(比如变量c中只捕获首尾的标题)。
  2. 单行模式未结合非贪婪匹配:即使开启了(?s)单行模式,贪婪匹配依然会覆盖中间结果,同时原正则未正确适配跨多行的内容结构。

正则修复方案

使用**非贪婪匹配.*?**结合单行模式(?s),修改后的正则如下:

str_extract_all(target_str, '(?s)(?<=&lt;/span&gt;).*?(?=&lt;/h)')[[1]] %>% str_squish()

测试验证

  • 对变量b执行:
    str_extract_all(b, '(?s)(?<=&lt;/span&gt;).*?(?=&lt;/h)')[[1]] %>% str_squish()
    # 输出:[1] "Linking data using left_join"
    
  • 对变量c执行:
    str_extract_all(c, '(?s)(?<=&lt;/span&gt;).*?(?=&lt;/h)')[[1]] %>% str_squish()
    # 输出:[1] "Standardising PISA results" "Linking data using left_join" "Standardising PISA results"
    

更可靠的替代方案:使用HTML解析包

正则处理HTML容易受标签结构变化影响,推荐用rvest包专门解析HTML,代码更鲁棒:

library(rvest)

# 提取a中的标题
read_html(a) %>% 
  html_elements("h2") %>% 
  html_text2() %>% 
  str_remove("^\\d+\\.\\d+ ")

# 提取b中的标题
read_html(b) %>% 
  html_elements("h2") %>% 
  html_text2() %>% 
  str_remove("^\\d+\\.\\d+ ")

# 提取c中的标题
read_html(c) %>% 
  html_elements("h2") %>% 
  html_text2() %>% 
  str_remove("^\\d+\\.\\d+ ")

这个方法会自动处理HTML实体编码和换行,无需复杂正则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 17:10:16