R使用RSelenium爬取网页时xml_find_all应用于character类报错求助
问题原因
第一个报错(xml_find_all找不到方法)
remDr$getPageSource()返回的是嵌套列表,取第一个元素后得到的是HTML字符串,直接对字符串调用html_nodes类的rvest方法会报错,必须先通过read_html()将字符串解析为XML/HTML对象才能使用rvest的选择器方法。
第二个报错(行数不匹配)
两个核心原因:
- 你使用了ID选择器
#offerPriceValue匹配商品现价,HTML中ID全局唯一,遍历每个商品节点时除了第一个商品外都匹配不到对应节点,返回长度为0的空向量 - 部分商品可能没有原价(
old-price节点),匹配不到时也会返回空向量,和固定长度为1的periodo/fecha/ecommerce字段行数不一致,导致data.frame生成失败
解决方法
- 先完成页面解析再遍历商品节点
- 把ID选择器替换为对应商品节点下的class选择器
- 对所有提取文本的步骤加空值兜底,匹配不到节点时返回NA保证长度一致
- 确认商品节点选择器和属性选择器和页面实际结构匹配
修正后代码
library(RSelenium) library(rvest) library(dplyr) library(stringr) library(purrr) library(lubridate) # 启动RSelenium rD <- rsDriver(port = 4560L, browser = "chrome", version = "3.141.59", chromever = "93.0.4577.63", geckover = "latest", iedrver = NULL, phantomver = "2.1.1", verbose = TRUE, check = TRUE) remDr <- rD[["client"]] Sys.sleep(10) tvs_url <- "https://www.lacuracao.pe/curacao/tv-y-audio/televisores" remDr$navigate(tvs_url) Sys.sleep(10) # 滚动加载全部商品 for(i in 1:20){ remDr$executeScript(paste("scroll(0,",i*10000,");")) Sys.sleep(5) } # 获取并解析页面源码 h <- remDr$getPageSource()[[1]] page_html <- read_html(h) product_nodes <- html_elements(page_html, "div.product") # 遍历提取信息,加空值兜底 df <- map_dfr(product_nodes, function(node){ data.frame( periodo = year(Sys.Date()), fecha = Sys.Date(), ecommerce = "lacuracao", producto = html_node(node, ".product_name") %>% html_text(trim = TRUE) %>% {if(length(.) == 0) NA_character_ else .}, precio.antes = html_node(node, '.old-price') %>% html_text(trim = TRUE) %>% {if(length(.) == 0) NA_character_ else .}, precio.actual = html_node(node, '.offer-price') %>% html_text(trim = TRUE) %>% {if(length(.) == 0) NA_character_ else .} ) }) # 关闭驱动 remDr$close() rD$server$stop()
注:如果现价选择器
.offer-price匹配不到,可以打开浏览器F12检查对应现价元素的class属性替换即可。
内容的提问来源于stack exchange,提问作者Omar Gonzales
相关产品推荐
相关产品推荐

