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

使用XPath遍历亚马逊商品列表异常:仅重复输出单个商品信息

解决亚马逊商品遍历重复输出问题

我来帮你搞定这个问题!你遇到的核心问题是每次循环都在定位页面上第一个匹配的商品元素,所以才会重复输出同一个商品的信息。咱们一步步拆解问题和解决办法:

问题根源分析

  • 元素定位未关联循环索引:你在for循环里直接用driver.findElement()查找商品名称和价格,Selenium默认只会返回页面上第一个匹配该XPath的元素,不管循环多少次,取的都是第一个商品的数据。
  • 循环边界逻辑错误:你的循环条件是i <= count,但products.size()返回的是26,商品列表的索引范围是0到25,这样循环会执行27次(0到26),不仅多循环一次,还可能引发找不到元素的异常。

修复后的代码实现

我们可以利用已获取的商品元素列表,同时修正循环边界和价格元素的定位逻辑,代码如下:

List<WebElement> products = driver.findElements(By.xpath("//div[@class=\"s-result-list s-search-results sg-row\"]//descendant::span[@class=\"a-size-base-plus a-color-base a-text-normal\"]"));
int count = products.size();
System.out.println(count);
//using XLS reader class to make runtime excel sheet and add column
Xls_Reader reader = new Xls_Reader(prop.getProperty("Excel"));
if (!reader.isSheetExist("ProductData")) {
    reader.addSheet("ProductData");
    reader.addColumn("ProductData", "Name of Product");
    reader.addColumn("ProductData", "Price of Product");
}
// 修正循环条件,只遍历到count-1索引(共count次循环)
for (int i = 0; i < count; i++) {
    // 直接从已获取的products列表中取对应索引的商品名称元素
    String prod_desc = products.get(i).getText();
    System.out.println("Done111");
    // Excel行号从1开始,所以用i+1作为行参数
    reader.setCellData("ProductData", "Name of Product", i+1, prod_desc);
    
    // 通过XPath索引定位对应位置的价格元素(XPath索引从1开始,所以用i+1)
    String prod_price= driver.findElement(By.xpath("(//div[@class=\"a-section a-spacing-none a-text-center\"]//descendant::span[@class=\"a-price-whole\"])[" + (i+1) + "]")).getText();
    System.out.println(prod_price);
    reader.setCellData("ProductData", "Price of Product", i+1, prod_price);
}
} catch(Exception e) {
    e.printStackTrace();
}

关键修复点说明

  • 复用已获取的元素列表:你已经通过findElements()拿到了所有商品名称的WebElement集合,直接用products.get(i)就能获取第i个商品的名称,既高效又避免了重复定位第一个元素的问题。
  • XPath索引定位价格:价格元素的XPath需要用(xpath表达式)[索引]的格式,注意Selenium的XPath索引是从1开始的,所以要使用i+1来匹配对应位置的商品价格。
  • 修正Excel行号:Excel的行号是从1开始的,而循环索引i从0开始,所以调用setCellData时要传入i+1作为行参数,确保数据写入正确的行。
  • 调整循环边界:把i <= count改为i < count,确保循环次数和商品数量一致(26次),避免越界问题。

这样修改后,就能正确遍历每个商品,把对应的名称和价格写入Excel表格了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:59:01