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

Selenium筛选公寓列表问题:Pop操作无法移除目标广告元素

解决Selenium过滤apartments.com广告元素的问题

你的代码没删除广告的核心原因是判断逻辑错误:你用apartments[i].find_elements(By.CSS_SELECTOR, ".reinforcement")是在当前元素的子节点里找带.reinforcement类的元素,但广告元素本身同时拥有.placard和.reinforcement两个类,并非子元素带这个类,所以这个判断永远返回空列表,自然不会触发pop操作。

下面给两种可行的解决方法:

方法一:用CSS选择器直接过滤(推荐)

直接通过CSS选择器排除带.reinforcement类的.placard元素,一步到位,不需要后续遍历删除,效率更高:

# 直接定位只带.placard、不带.reinforcement的元素
apartments = WebDriverWait(driver, 2).until(
    EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".placard:not(.reinforcement)"))
)
print(len(apartments))
# 输出应为25,已过滤掉广告

方法二:修正遍历判断逻辑

如果要保留先全选再过滤的逻辑,修改判断条件,检查元素自身的class属性是否包含reinforcement:

# Wait for the first page of listings to load
apartmentsTOBEDELETED = WebDriverWait(driver, 2).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".reinforcement")))
print(len(apartmentsTOBEDELETED))
# output is 1 .reinforcement ad

apartments = WebDriverWait(driver, 2).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".placard")))
print(len(apartments))
# output is 26, including one "apartment" (the ad) with the ".placard" and ".reinforcement" CSS tag

# 修改判断逻辑:检查元素自身的class是否包含reinforcement
i = 0
while i < len(apartments):
    # 获取元素的class属性,判断是否包含目标类
    if "reinforcement" in apartments[i].get_attribute("class"):
        print("found the element TO BE DELETED")
        apartments.pop(i)
    else:
        i += 1

# Print the number of apartments in the filtered list
print(len(apartments))
# 输出应为25,广告已被删除

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 01:07:51