RSelenium抓取荷兰历史选举数据:无法获取whitebox内容及迭代需求
解决RSelenium抓取荷兰选举数据的问题
核心问题:无法提取whitebox内的选举结果
你当前的代码仅定位到whitebox元素,但未提取其中的内容;另外点击下拉选项后页面可能存在异步加载延迟,直接抓取会导致获取不到数据。可以按以下步骤修复:
1. 添加显式等待,确保元素加载完成
使用等待机制避免页面未渲染完成就抓取:
library(wdman) library(RSelenium) library(rvest) rD <- rsDriver(browser="firefox", port=4545L, verbose=F) remDr <- rD[["client"]] url <- 'https://www.verkiezingsuitslagen.nl/verkiezingen/detail/TK19250701/663214' remDr$navigate(url) # 操作下拉菜单 dropdown1 <- remDr$findElement(using = 'id', value = "2") dropdown1$clickElement() dropdown2 <- remDr$findElement(using = 'id', value = "3") dropdown2$clickElement() option <- remDr$findElement(using = 'xpath', "/html/body/main/div/div/div[2]/div[1]/div/div[2]/div/select/option[2]") option$clickElement() # 最长等待10秒,直到whitebox元素出现 remDr$waitForElement(using = 'class name', value = "whitebox", timeout = 10000) # 获取whitebox内部的HTML内容 results_element <- remDr$findElement(using = 'class name', value = "whitebox") results_html <- results_element$getElementAttribute("innerHTML")[[1]] # 用rvest解析HTML提取表格数据 results_table <- read_html(results_html) %>% html_table(fill = TRUE) print(results_table)
2. 提取表格数据的替代方案
如果whitebox内是标准表格,可直接定位表格元素提取:
# 等待表格加载完成 remDr$waitForElement(using = 'css selector', value = ".whitebox table", timeout = 10000) table_element <- remDr$findElement(using = 'css selector', value = ".whitebox table") table_html <- table_element$getElementAttribute("innerHTML")[[1]] results_table <- read_html(table_html) %>% html_table(fill = TRUE)
迭代处理每个Gemeente的方案
要遍历所有Gemeente,先获取所有选项列表,循环点击并抓取数据:
# 获取Gemeente下拉菜单的所有选项 gemeente_dropdown <- remDr$findElement(using = 'xpath', "/html/body/main/div/div/div[2]/div[1]/div/div[2]/div/select") gemeente_options <- gemeente_dropdown$findChildElements(using = 'tag name', value = "option") # 存储所有结果的列表 all_results <- list() # 循环遍历每个选项 for (i in seq_along(gemeente_options)) { # 点击当前Gemeente选项 gemeente_options[[i]]$clickElement() # 等待whitebox加载 remDr$waitForElement(using = 'class name', value = "whitebox", timeout = 10000) # 抓取并解析数据 results_element <- remDr$findElement(using = 'class name', value = "whitebox") results_html <- results_element$getElementAttribute("innerHTML")[[1]] results_table <- read_html(results_html) %>% html_table(fill = TRUE) # 获取当前Gemeente名称并存储结果 gemeente_name <- gemeente_options[[i]]$getElementAttribute("text")[[1]] all_results[[gemeente_name]] <- results_table # 添加短暂延迟,避免请求过快 Sys.sleep(1) } # 关闭浏览器驱动 remDr$close() rD$server$stop()
注意事项
- 确保安装依赖包:
install.packages(c("RSelenium", "rvest", "wdman")) - 若页面加载缓慢,可延长
timeout时间或增加Sys.sleep()的延迟时长 - 若元素定位失败,需检查页面结构是否变化,更新XPath或CSS选择器
内容的提问来源于stack exchange,提问作者Jasper
相关产品推荐
相关产品推荐

