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
相关产品推荐
相关产品推荐

