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

使用R进行Web Scraping:下拉菜单选择问题求助

解决RSelenium无法选中下拉菜单并循环抓取数据的方案

核心问题分析

你的代码仅定位了下拉框和按钮元素,但未实现提取下拉选项、选中指定选项以及遍历所有组合的逻辑,同时缺少Selenium驱动的完整初始化步骤。

完整解决方案代码

library(RSelenium)

# 1. 初始化Selenium驱动(以Chrome为例,需确保驱动与浏览器版本匹配)
# 若使用最新版Chrome,可省略chromever参数;旧版本需指定对应版本号
rs_driver_object <- rsDriver(browser = "chrome")
remDr <- rs_driver_object$client

# 2. 目标页面导航
remDr$navigate("http://extranet.artesp.sp.gov.br/TransporteColetivo/OrigemDestino?fbclid=IwAR3_hZwajHk_iyU085S1LDTqLCOYLHIZ5K825XgPGcB4tMI0EuCJpQNrJHM#")

# 3. 提取下拉菜单所有有效选项
# 处理Origem下拉框
origem_options <- remDr$findElement(using = 'id', 'Origem')$findChildElements(using = 'tag name', 'option')
origem_list <- lapply(origem_options, function(x) {
  list(text = x$getElementText()[[1]], value = x$getElementAttribute("value")[[1]])
})
# 过滤空值选项(排除默认占位项)
origem_list <- Filter(function(item) item$value != "", origem_list)

# 处理Destino下拉框
destino_options <- remDr$findElement(using = 'id', 'Destino')$findChildElements(using = 'tag name', 'option')
destino_list <- lapply(destino_options, function(x) {
  list(text = x$getElementText()[[1]], value = x$getElementAttribute("value")[[1]])
})
destino_list <- Filter(function(item) item$value != "", destino_list)

# 4. 创建空数据框存储结果
result_df <- data.frame(
  Origem = character(),
  Destino = character(),
  Resultado = character(),
  stringsAsFactors = FALSE
)

# 5. 双重循环遍历所有选项组合
for (origem_item in origem_list) {
  # 选中当前Origem选项
  remDr$findElement(using = 'id', 'Origem')$sendKeysToElement(list(origem_item$value))
  # 等待页面响应(若下拉框为联动式,需延长等待时间)
  Sys.sleep(2)
  
  for (destino_item in destino_list) {
    # 选中当前Destino选项
    remDr$findElement(using = 'id', 'Destino')$sendKeysToElement(list(destino_item$value))
    Sys.sleep(1)
    
    # 点击查询按钮
    btn_pesquisar <- remDr$findElement(using = 'id', 'btnPesquisar')
    btn_pesquisar$clickElement()
    # 等待结果加载完成(根据页面速度调整时长)
    Sys.sleep(3)
    
    # 抓取查询结果(需根据实际页面HTML结构调整元素定位)
    resultado_texto <- tryCatch(
      {remDr$findElement(using = 'css selector', '#resultado-area')$getElementText()[[1]]},
      error = function(e) {"无匹配结果"}
    )
    
    # 将结果存入数据框
    result_df <- rbind(result_df, data.frame(
      Origem = origem_item$text,
      Destino = destino_item$text,
      Resultado = resultado_texto,
      stringsAsFactors = FALSE
    ))
  }
}

# 6. 清理资源
remDr$close()
rs_driver_object$server$stop()

# 可选:将结果写入本地文件
write.csv(result_df, "origem_destino_resultados.csv", row.names = FALSE)

关键注意事项

  • 驱动版本匹配:Chrome驱动需与本地Chrome版本一致,可从对应官方渠道下载匹配版本
  • 等待逻辑优化:Sys.sleep是简单等待方式,更高效的做法是使用remDr$waitForElement等待目标元素加载完成,避免无效等待
  • 联动下拉处理:若选择Origem后Destino选项会动态更新,需在每次循环Origem后重新获取Destino的选项列表,而不是提前一次性提取
  • 结果定位调整:代码中#resultado-area是假设的结果容器选择器,需根据实际页面的HTML结构修改为正确的元素定位方式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 13:41:23