如何从含换行的HTML中提取<h2>标题文本?R正则问题求助
解决HTML中h2标题提取的正则问题
问题分析
你当前的正则存在两个核心问题:
- 贪婪匹配:
.*会从第一个</span>匹配到最后一个</h,导致多匹配场景下跳过中间的标题(比如变量c中只捕获首尾的标题)。 - 单行模式未结合非贪婪匹配:即使开启了
(?s)单行模式,贪婪匹配依然会覆盖中间结果,同时原正则未正确适配跨多行的内容结构。
正则修复方案
使用**非贪婪匹配.*?**结合单行模式(?s),修改后的正则如下:
str_extract_all(target_str, '(?s)(?<=</span>).*?(?=</h)')[[1]] %>% str_squish()
测试验证
- 对变量
b执行:str_extract_all(b, '(?s)(?<=</span>).*?(?=</h)')[[1]] %>% str_squish() # 输出:[1] "Linking data using left_join" - 对变量
c执行:str_extract_all(c, '(?s)(?<=</span>).*?(?=</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
相关产品推荐
相关产品推荐

