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

使用html_nodes抓取网页内容时出现重复问题求解决

解决rvest抓取文本重复的问题

这个重复问题的根源在于你连续调用html_nodes()的方式——每次调用html_nodes()都会在当前选中的节点集合里再次筛选,这会导致父节点和子节点的文本被多次提取(比如一个<div>包含文本,它本身不是script/style,它的子节点也符合条件,两次筛选后都会被保留,最终html_text()会把两者的文本合并,造成重复)。

修复方案1:合并排除选择器

把两次html_nodes()合并成一次,用复合选择器同时排除script和style节点:

library(rvest)

address <- "https://www.speedtest.net/"
content <- read_html(URLencode(address))

content %>% 
  html_nodes("body :not(script):not(style)") %>%  # 一次筛选出body下非script/style的节点
  html_text() %>%
  paste(collapse = " ")  # 可选:把分散的文本合并成一段

修复方案2:使用html_remove()更直观

先选中body,再直接移除所有script和style节点,最后提取文本,逻辑更清晰:

content %>% 
  html_element("body") %>%  # 选中单个body节点
  html_remove("script, style") %>%  # 移除所有script和style子节点
  html_text() %>%
  paste(collapse = " ")

为什么原来的代码会重复?

你原来的代码:

html_nodes("body") %>% 
  html_nodes(":not(script)") %>% 
  html_nodes(":not(style)")

第一次html_nodes("body")选中了<body>节点;第二次html_nodes(":not(script)")会选中<body>下所有不是script的节点(包括<body>本身和它的所有非script子节点);第三次html_nodes(":not(style)")又在这些节点里筛选非style的,最终<body>节点(包含所有子节点文本)和它的子节点(各自的文本)都会被保留,html_text()提取时就会把这些文本重复输出。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 07:17:28