SeleniumBasic VBA爬取:FindElementByXPath错误获取其他行Class内容
解决SeleniumBasic VBA爬取Farnell时Pkg Option重复第一行的问题
核心问题是你获取Pkg Option的XPath没有限定在当前遍历的产品行范围内,导致每次都全局查找第一个匹配元素。
修复步骤
确保基于当前行节点查找子元素
遍历产品行时,必须用当前行的WebElement对象调用FindElementByXPath,而非直接用driver对象,同时XPath要写相对路径(开头加.)。示例修正代码
假设你的原有代码框架如下,这里给出修正后的关键部分:Dim driver As New ChromeDriver Dim ProductRows As WebElements Dim row As WebElement Dim MPN, Supplier_ID, QTY_InStock, Pkg_Option As String driver.Get "你的Farnell产品列表URL" Set ProductRows = driver.FindElementsByXPath("//tr[contains(@class,'product-row')]") '根据实际HTML调整行定位 For Each row In ProductRows ' 其他属性的正确写法(基于当前行查找) MPN = row.FindElementByXPath(".//td[@data-header='MPN']").Text Supplier_ID = row.FindElementByXPath(".//td[@data-header='Supplier ID']").Text QTY_InStock = row.FindElementByXPath(".//td[@data-header='Stock']").Text ' 修正Pkg Option的获取方式:用当前行的相对路径 ' 错误写法(全局查找):driver.FindElementByXPath("//td[@data-header='Package Option']").Text ' 正确写法(限定在当前行内查找) Pkg_Option = row.FindElementByXPath(".//td[@data-header='Package Option']").Text ' 输出或写入数据 Debug.Print MPN, Supplier_ID, QTY_InStock, Pkg_Option Next row
关键细节
- 相对路径的
.代表从当前节点(即当前产品行row)开始查找,而非整个文档根节点。 - 若Pkg Option的元素嵌套较深,可改用
./descendant::*[@class='你的pkg-option类名']来匹配当前行下所有后代节点中的目标元素。 - 调试时可通过
Debug.Print row.Attribute("outerHTML")查看当前行的HTML结构,确认Pkg Option元素的位置和属性是否符合你的XPath定位。
内容的提问来源于stack exchange,提问作者Andras
相关产品推荐
相关产品推荐

