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

使用rvest与selectorGadget爬取网页时html_nodes返回{xml_nodeset (0)}的问题咨询

解决rvest无法获取动态渲染内容的问题

嘿,我来帮你搞定这个爬取难题!你遇到的{xml_nodeset (0)}问题,大概率是因为目标内容是JavaScript动态渲染出来的——rvest默认只能抓取页面的静态HTML源码,而那些支付信息是页面加载完成后通过JS动态生成的,静态源码里根本找不到.product-payment这个节点,所以自然抓不到。

下面给你两个可行的解决办法:

方法一:用浏览器自动化工具(RSelenium/playwrightR)模拟渲染

这类工具可以像真实用户一样打开浏览器,执行JS并加载完整页面,之后你就能抓取到渲染后的内容了。这里以RSelenium为例:

library(RSelenium)
library(rvest)
library(dplyr)

# 启动Chrome浏览器(确保chromedriver版本和你的Chrome版本匹配)
driver <- rsDriver(browser = "chrome", port = 4567L)
remDr <- driver[["client"]]

# 访问目标页面
remDr$navigate("https://www.dicasanet.com.br/material-de-construcao")

# 等待页面完全加载(根据网络情况调整时间,或者用更智能的等待方法)
Sys.sleep(5)

# 获取渲染后的页面源码
page_source <- remDr$getPageSource()[[1]]
html <- read_html(page_source)

# 现在再尝试抓取目标节点
payment_elements <- html %>% html_nodes(".product-payment")
payment_text <- payment_elements %>% html_text(trim = TRUE)

# 查看结果
print(payment_text)

# 记得关闭浏览器和驱动
remDr$close()
driver$server$stop()

如果觉得RSelenium配置麻烦,也可以试试更轻量的playwrightR,它的API更简洁,也不需要单独装驱动。

方法二:直接调用网站的API接口(更高效)

很多电商网站的动态内容都是通过API接口获取的,你可以跳过页面渲染,直接请求接口拿数据:

  1. 打开浏览器开发者工具(按F12),切换到「Network」标签;
  2. 刷新页面,筛选「XHR/Fetch」类型的请求;
  3. 找和产品支付信息相关的接口(通常URL里会有product、payment这类关键词);
  4. 复制接口URL,用httr包发送请求并解析返回的JSON数据。

示例代码大概是这样:

library(httr)
library(jsonlite)

# 替换成你找到的真实API接口URL
api_url <- "https://www.dicasanet.com.br/api/products/construction-materials"

# 发送GET请求
response <- GET(api_url)
# 解析JSON数据
product_data <- fromJSON(content(response, "text"))

# 提取支付相关信息(具体字段根据接口返回结构调整)
payment_info <- product_data$items %>% 
  select(product_name, payment_terms, installments)

print(payment_info)

一些注意事项

  • 一定要遵守网站的robots.txt协议,不要频繁发送请求,避免被封禁IP;
  • 如果用浏览器自动化工具,记得匹配好浏览器和驱动的版本,不然会启动失败;
  • 动态页面的元素加载时间可能不稳定,用RSelenium时可以用waitForElement方法代替固定的Sys.sleep,更可靠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 15:39:05