R rvest文本抓取:如何从HTML节点移除指定标签并提取p标签文本
解决方法
你可以按p节点为单位逐个处理,先删除每个p节点内不需要的a、b节点,再提取合并后的文本,示例代码如下:
# 加载依赖包 library(rvest) library(httr) library(purrr) library(xml2) # 抓取解析页面 page <- GET(url = "https://xxx") %>% read_html() # 提取所有目标p节点 p_list <- page %>% html_elements(xpath = "//div[@class='speech']/p") # 逐个处理p节点,输出字符向量 result <- map_chr(p_list, function(p_node) { # 删除当前p节点内所有a、b节点及对应内容 xml_remove(xml_find_all(p_node, ".//a|.//b")) # 提取合并文本:自动将所有子文本拼接为单个字符串,保留i、sup内部文本,去除标签 # 若需要保留浏览器渲染格式的换行用html_text2(),不需要多余空白用html_text(trim = TRUE) html_text(p_node, trim = TRUE) }) # 如需转数据框直接转换即可 df <- data.frame(speech_text = result)
逻辑说明
你之前的代码直接提取所有文本节点,会把被标签拆分的每一段文本都作为独立元素返回,自然会拆分同一个p节点的内容。新的处理逻辑:
- 先定位到所有目标
p节点,保证每个p为独立处理单元,最终每个p对应一个结果条目 - 先删除每个
p节点内不需要的a、b节点,直接过滤掉这部分内容 - 调用
html_text()提取文本时,会自动合并当前节点下所有文本内容,同时自动移除i、sup、br等标签,保留标签内部的文本,最终输出单个字符串
内容的提问来源于stack exchange,提问作者Etienne Brossard
相关产品推荐
相关产品推荐

