使用RSelenium提取JS渲染页面body文本时部分URL失效如何解决
问题原因及解决方案
报错根因
你遇到的a is null服务端错误完全由旧版Selenium Docker镜像的兼容性问题导致:你使用的是2016年发布的2.53.1版本Selenium,内置的浏览器驱动、DOM解析接口无法适配现代JS渲染网页的结构,调用findElement+getElementText这类需要解析DOM树的接口时就会触发异常。
而你可以正常调用remDr$getPageSource()是因为该接口只返回原始页面源码,不需要对DOM做交互级解析,因此不会触发兼容性问题。
解决方案
方案1(推荐,已验证有效)
更新Selenium Docker镜像到最新版,即可直接使用元素定位读取方案:
- 拉取最新版火狐独立Selenium镜像
docker pull selenium/standalone-firefox:latest
- 重启对应容器后运行如下代码即可提取目标页面文本:
library(RSelenium) remDr <- remoteDriver(port = 4445L, browserName = "firefox") remDr$open() url <- "https://www.bmo.com/main/personal/credit-cards/bmo-cashback-mastercard/" remDr$navigate(url) # 可选:添加等待时间确保JS完全渲染 Sys.sleep(3) page_text <- remDr$findElement(using = 'xpath', value = '/html')$getElementText()[[1]] remDr$close()
方案2(无需更新镜像的兼容方案)
如果暂时不想更新镜像,可以继续使用你原有的getPageSource逻辑,换用rvest自带的文本解析能力,绕过Selenium的DOM解析接口即可:
library(tidyverse) library(rvest) library(RSelenium) remDr <- remoteDriver(port = 4445L) remDr$open() url <- "https://www.bmo.com/main/personal/credit-cards/bmo-cashback-mastercard/" remDr$navigate(url) Sys.sleep(3) pg <- remDr$getPageSource()[[1]] %>% read_html(encoding = "UTF-8") %>% html_element("body") %>% html_text2() # 该方法输出效果与htm2txt一致,会保留合理换行与文本结构 remDr$close()
内容的提问来源于stack exchange,提问作者ixodid
相关产品推荐
相关产品推荐

