VBA Selenium提取网页规格数据:实现键值对非合并格式输出
解决Grainger产品规格提取格式问题的VBA Selenium方案
原代码直接提取整个规格区域的文本,导致参数标签与对应值合并在一起。要实现「Spec1:Value1|Spec2:Value2|...」的格式,需要定位到每个规格项的标签和值元素分别抓取,以下是修改后的方案:
修改后的代码
Sub ExtractGraingerSpecs() Dim driver As New Selenium.ChromeDriver Dim specItems As Selenium.WebElements Dim specItem As Selenium.WebElement Dim specLabel As Selenium.WebElement Dim specValue As Selenium.WebElement Dim i As Long Dim lastRow As Long Dim specText As String ' 获取最后一行行号 lastRow = Sheet1.Cells(Rows.Count, "A").End(xlUp).Row ' 启动Chrome浏览器(只启动一次,提升效率) driver.Start For i = 2 To lastRow specText = "" ' 初始化规格文本 ' 获取当前行的产品链接 Dim myUrl As String myUrl = Sheet1.Cells(i, "A").Value ' 打开目标页面 driver.Get myUrl driver.Wait 5000 ' 等待页面加载,可根据网络情况调整 ' 定位所有规格项(根据页面实际结构,每个规格项是包含标签和值的容器) Set specItems = driver.FindElementsByCss(".P9I57X ._2x4xwN") ' 遍历每个规格项,提取标签和值 For Each specItem In specItems On Error Resume Next ' 防止部分规格项结构异常导致报错 Set specLabel = specItem.FindElementByCss("._3JxJ6E") Set specValue = specItem.FindElementByCss("._1l0el9") ' 拼接规格文本 If Not specLabel Is Nothing And Not specValue Is Nothing Then If specText <> "" Then specText = specText & "|" specText = specText & specLabel.Text & ":" & specValue.Text End If On Error GoTo 0 ' 恢复错误处理 Set specLabel = Nothing Set specValue = Nothing Next specItem ' 将结果写入B列 Sheet1.Cells(i, "B").Value = specText Next i ' 关闭浏览器 driver.Quit End Sub
关键改动说明
- 复用浏览器实例:将ChromeDriver的启动/关闭移到循环外,避免每次处理链接都重启浏览器,大幅提升效率
- 精准定位元素:通过CSS选择器定位每个规格项的标签(
._3JxJ6E)和值(._1l0el9)元素,确保标签与值一一对应 - 错误处理:添加
On Error Resume Next防止部分规格项结构异常导致代码中断 - 格式拼接:遍历所有规格项,按「标签:值」的格式拼接,用
|分隔不同规格
注意事项
- 若Grainger页面结构更新,需检查并调整CSS选择器(可通过浏览器开发者工具查看元素的class属性)
- 等待时间(
driver.Wait)可根据网络速度调整,确保页面完全加载后再提取元素
内容的提问来源于stack exchange,提问作者jaga jagga
相关产品推荐
相关产品推荐

