Selenium如何筛选仅含单类名元素 排除带附加类的同名元素
Selenium的find_elements_by_class_name方法为包含匹配规则,只要元素的class属性中存在指定类名就会被命中,所以同时携带ads-title、ads-year两个类的元素也会被返回。
以下是三种可直接使用的解决方案:
方案1:使用CSS选择器定位(推荐)
规则1:完全匹配class属性仅为ads-title的元素
直接校验class属性的完整值,完全符合才会被选中:
driver = webdriver.Chrome(r"./chromedriver") driver.get('https://mashinbank.com/%D8%AE%D8%B1%DB%8C%D8%AF-%D8%AE%D9%88%D8%AF%D8%B1%D9%88') # 替换原有class定位为css选择器定位 names = driver.find_elements_by_css_selector("div[class='ads-title']") for name in names: print(name.text)
规则2:排除携带ads-year类的元素
如果后续可能有其他类加在ads-title元素上,仅需要排除带ads-year的元素,可以用:not伪类实现:
names = driver.find_elements_by_css_selector("div.ads-title:not(.ads-year)")
方案2:使用XPath定位
和CSS选择器逻辑一致,两种匹配规则对应代码如下:
# 完全匹配class属性仅为ads-title names = driver.find_elements_by_xpath("//div[@class='ads-title']") # 匹配含ads-title且不含ads-year的元素 names = driver.find_elements_by_xpath("//div[contains(@class,'ads-title') and not(contains(@class,'ads-year'))]")
方案3:对查询结果二次过滤
如果不想修改原有定位逻辑,可以拿到所有元素后做属性过滤:
driver = webdriver.Chrome(r"./chromedriver") driver.get('https://mashinbank.com/%D8%AE%D8%B1%DB%8C%D8%AF-%D8%AE%D9%88%D8%AF%D8%B1%D9%88') names = driver.find_elements_by_class_name('ads-title') for name in names: # 过滤掉包含ads-year类的元素 if 'ads-year' not in name.get_attribute('class'): print(name.text)
内容的提问来源于stack exchange,提问作者pickle rick
相关产品推荐
相关产品推荐

