使用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
相关产品推荐
相关产品推荐

