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

Selenium(Python)遍历父元素时子元素值重复问题排查

问题定位与解决方案

核心原因

你遇到的问题几乎肯定是对象引用复用或者类属性误用导致的:

  • 情况1:你在循环外部提前创建了一个Listing实例,每次循环只是修改这个实例的属性,最后所有房源都指向同一个对象,自然会显示最后一次赋值的结果。
  • 情况2:Listing类里把available_until、reactions定义成了类属性(直接写在类里,没在__init__里用self.绑定),类属性是所有实例共享的,最后会被最后一次赋值覆盖。

修复步骤

1. 检查Listing类的定义

确保所有字段都是实例属性,必须在__init__方法里用self.声明:

class Listing:
    def __init__(self):
        self.price = None
        self.address = None
        self.available_until = None  # 必须用self.绑定到实例
        self.reactions = None

如果之前是直接写在类里(比如available_until = None),那就是类属性,会被所有实例共享,修改时会覆盖全局值。

2. 循环内创建新的Listing实例

每次遍历父元素时,都要新建一个Listing对象,而不是复用之前的:

# 错误写法(复用同一个对象):
listing = Listing()
for parent_div in parent_div_list:
    listing.price = parent_div.find_element(By.XPATH, "./div[@class='price']").text
    listing.available_until = parent_div.find_element(By.XPATH, "./div[@class='until']").text
    listings.append(listing)

# 正确写法(每次循环新建对象):
listings = []
for parent_div in parent_div_list:
    listing = Listing()  # 关键:循环内创建新实例
    listing.price = parent_div.find_element(By.XPATH, "./div[@class='price']").text
    listing.address = parent_div.find_element(By.XPATH, "./div[@class='address']").text
    listing.available_until = parent_div.find_element(By.XPATH, "./div[@class='available-until']").text
    listing.reactions = parent_div.find_element(By.XPATH, "./div[@class='reactions']").text
    listings.append(listing)

3. 验证定位逻辑(补充)

确保使用相对路径XPATH(开头加./),这样是从当前父元素下查找子元素,而不是全局查找:

  • 正确的相对XPATH:./div[@class='available-until']
  • 错误的绝对XPATH://div[@class='available-until'](会全局匹配第一个符合条件的元素)

测试验证

修改后,循环内可以打印listing对象的内存地址(比如print(id(listing))),如果每个循环的地址都不一样,说明是新创建的实例,问题就能解决。

内容的提问来源于stack exchange,提问作者Jeremy Smith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 12:32:43