Selenium VBA如何通过following-sibling跨div导航提取商品价格
Selenium VBA 基于following-sibling的元素导航方案
XPath语法兼容性说明
following-sibling 轴后完全可以直接拼接任意深度的层级路径,不存在语法限制。
- 路径拼接逻辑和常规XPath规则一致:先通过
following-sibling轴定位到当前节点后方、同DOM层级的目标节点,再通过/标签名的形式从该节点出发,向下遍历内部嵌套的子元素,和普通DOM路径的写法没有区别。 - 合法写法示例:
following-sibling::div[@class='item-container']/div/span[@class='price'],可以精准定位到锚点后方同层容器内嵌套的子元素,也就是你提到的类似/div/div/span/h1的路径写法。
现有代码的常见问题排查
你当前逻辑中价格提取失效,基本是3个典型错误导致的:
- 写了
//div//following-sibling::div这类带根级绝对路径的选择器,直接跳出了当前商品循环的上下文,选中全页面第一个匹配的div,和当前遍历的商品没有任何关联。 - 商品遍历和价格遍历是两个完全独立的循环,没有基于当前商品锚点建立和价格块的关联关系,行号错位,哪怕找到了价格块,也无法对应到正确的商品行。
- 使用
previous::span的反向定位逻辑范围太宽泛,容易选中同页面其他无关区块的span节点,拿不到正确的价格值。
适配目标页面的following-sibling实现
全程以你已经可以稳定识别的商品标题h1(h1[@class='minificha__nombre-producto'])为锚点,所有导航逻辑全部基于该锚点通过following-sibling实现,不替换你已经验证可用的定位方案:
i = 2 Set mysheet = Sheets("Hoja1") Set products = driver.FindElementsByXPath(".//h1[@class='minificha__nombre-producto']") For Each product In products ' 从h1锚点出发,取同层第一个span作为商品编码 productCode = product.FindElementByXPath("following-sibling::span[1]").Text If productCode <> "" Then ' 从h1锚点出发,找后方同层的第一个div容器,再下钻取容器内嵌套的价格、库存节点 priceText = product.FindElementByXPath("following-sibling::div[1]/div[@class='minificha__precio-preferencial']").Text stockText = product.FindElementByXPath("following-sibling::div[1]/div[@class='minificha__stock']").Text ' 按列写入Excel mysheet.Cells(i, 1).Value = productCode mysheet.Cells(i, 2).Value = product.Text mysheet.Cells(i, 3).Value = stockText mysheet.Cells(i, 4).Value = priceText i = i + 1 End If Next
路径编写注意事项
- 从循环内的单个元素(比如上面的
product)出发写XPath时,开头绝对不要加根级//,否则会直接从文档根节点开始查找,丢失当前循环的上下文定位。 - 给following-sibling选中的同层节点加序号限定(比如
[1]),避免选中列表中其他商品块的同层节点,防止导航范围串位。 - 如果目标价格块嵌套层级较深,只要顺着DOM结构在following-sibling选中的节点后补全每一层的路径即可,例如
following-sibling::div[1]/div[2]/section/span,这种写法完全符合XPath语法规范。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

