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

