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

无法从目标网站提取价格变量?怀疑代码中存在span嵌套问题

问题原因
  • 核心原因是目标站点的价格数据为客户端JavaScript动态加载渲染生成,rvest仅能抓取初始静态HTML,此时.price类节点为无内容的占位标签,提取自然返回空白。
  • 就算拿到渲染完成的页面内容,.price节点内部嵌套了多个带货币符号、价格单位、空格分隔符的子span标签,直接提取全文本后混杂大量非数字字符,直接调用as.numeric()会自动转换为NA。
解决办法

方案1:静态提取内嵌JSON数据(无需模拟浏览器,效率更高)

目标站点会把所有设备的初始数据存放在页面的<script>标签内嵌的JSON字符串中,直接用正则提取即可,不需要渲染页面:

library(rvest)
library(stringr)
library(jsonlite)

url <- 'https://www.kimovil.com/en/compare-smartphones/f_min_dm+unveileddate.3,i_b+slug.samsung'
webpage <- read_html(url)

# 提取包含设备数据的script标签内容
script_content <- html_text(html_nodes(webpage, "script[type='text/javascript']")) %>% 
  str_subset("window.__NUXT__")

# 解析完整设备列表JSON,可同时获取型号、参数等多维度信息
full_data <- str_match(script_content, "window\\.__NUXT__\\=(.*?)\\;<")[,2] %>% 
  fromJSON()
# 提取价格字段,JSON层级可根据实际解析后的结构调整
device_cost <- full_data$data[[1]]$publicProductList$items$price %>% as.numeric()

方案2:用RSelenium模拟浏览器动态渲染后提取

如果需要模拟用户交互、处理更多滚动加载的内容,可以用RSelenium启动浏览器加载页面,等内容渲染完成后再提取,同时处理嵌套标签的文本清洗:

library(RSelenium)
library(rvest)
library(stringr)

# 启动Chrome驱动(需提前安装对应版本的Chrome和chromedriver)
driver <- rsDriver(browser = "chrome", chromever = "你的Chrome对应版本号")
remDr <- driver$client
remDr$navigate(url)

# 等待页面价格元素加载完成,可根据网络情况调整等待时长
Sys.sleep(3)
# 获取渲染后的完整页面源码
rendered_page <- read_html(remDr$getPageSource()[[1]])

# 提取.price节点文本,清洗非数字字符后转数值
device_cost <- html_nodes(rendered_page, ".price") %>% 
  html_text() %>% 
  str_remove_all("[^0-9\\.]") %>% # 只保留数字和小数点,可根据实际货币格式调整规则
  as.numeric()

# 关闭驱动进程
remDr$close()
driver$server$stop()
注意事项
  • 提取时注意处理不同区域的货币符号、千位分隔符,可根据实际返回的文本调整正则清洗规则。
  • 频繁爬取建议添加随机请求间隔,避免触发站点反爬机制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 08:36:04