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

使用R的RSelenium爬取ISO标准页面遇阻:兼容与选择器问题

问题解决办法

一、Selenium与浏览器版本兼容问题

你代码里已经用了Firefox,但如果还是碰到版本不匹配问题,试试这两种方法:

  • 用wdman包自动下载匹配当前浏览器的驱动:
    library(wdman)
    # 适配Firefox
    geckodriver()
    # 适配Chrome
    chromedriver()
    
  • 换用chromote包:无需启动可视化浏览器,轻量且避免版本兼容问题,适合动态渲染页面。

二、CSS选择器无法遍历所有结果的问题

你的选择器用了:nth-child(2),只能选中单个卡片,要改成匹配所有标准卡片的选择器。以下是修正后的完整代码:

library(RSelenium)
library(netstat)
library(dplyr)

# 设置英文环境
Sys.setlocale("LC_ALL", "English")

# 启动Firefox驱动,自动分配端口
rs_driver_object <- rsDriver(browser = 'firefox', verbose = FALSE, port = free_port(random = TRUE))
remDr <- rs_driver_object$client
remDr$open()

# 用列表存结果,比循环rbind高效
standards_list <- list()

# 遍历24页搜索结果
for(page_num in 1:24) {
  page_url <- paste0("https://www.iso.org/search.html?PROD_isoorg_en%5Bquery%5D=packaging&PROD_isoorg_en%5Bmenu%5D%5Bfacet%5D=standard&page=", page_num)
  remDr$navigate(page_url)
  Sys.sleep(3) # 等待页面加载,按需调整时长

  # 获取当前页所有标准卡片
  cards <- remDr$findElements(using = 'css selector', '.card')

  # 逐个处理卡片
  for(card in cards) {
    # 提取标准编号
    code_elem <- card$findElement(using = 'css selector', 'div.card-body > div > a')
    standard_number <- code_elem$getElementText()[[1]]

    # 提取标题(去掉编号部分)
    full_text <- card$findElement(using = 'css selector', 'div.card-body > div')$getElementText()[[1]]
    standard_title <- gsub(paste0(standard_number, "\n"), "", full_text)

    # 提取详情页链接
    standard_link <- code_elem$getElementAttribute("href")[[1]]

    # 进入详情页
    remDr$navigate(standard_link)
    Sys.sleep(3)

    # 提取页数,捕获异常避免程序崩溃
    page_count <- tryCatch(
      remDr$findElement(using = 'css selector', '.refine li:nth-child(2) div.value')$getElementText()[[1]],
      error = function(e) NA
    )

    # 提取发布日期
    pub_date <- tryCatch(
      remDr$findElement(using = 'css selector', '#publicationDate span.value')$getElementText()[[1]],
      error = function(e) NA
    )

    # 存入列表
    standards_list[[length(standards_list)+1]] <- data.frame(
      Number = standard_number,
      Title = standard_title,
      PageCount = page_count,
      PublicationDate = pub_date,
      stringsAsFactors = FALSE
    )

    # 返回搜索页,继续处理下一个卡片
    remDr$navigate(page_url)
    Sys.sleep(2)
  }
}

# 合并为数据框
standards_df <- bind_rows(standards_list)

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

# 查看结果
print(standards_df)

关键修正点:

  • 选择器调整:用.card匹配所有标准卡片,不再限制固定位置;卡片内部通过子元素精准定位编号、标题和链接。
  • 异常处理:用tryCatch处理部分标准缺失信息的情况,防止程序中断。
  • 性能优化:用列表存储结果后合并,避免循环rbind的低效问题。
  • 页面切换:从详情页返回当前搜索结果页,确保后续卡片能正确定位。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 11:10:36