使用Selenium提取网页id属性中数字部分时出现重复值问题
问题成因与解决方案
成因
- 仅返回单个数字结果的核心原因:
list_of_ids被定义在循环内部,每次遍历元素时都会用当前元素的提取结果覆盖该变量,循环结束后仅保留最后一个元素的数字提取结果。 - ID重复出现的原因:你采集的目标网页不符合HTML ID唯一性规范,存在多个元素共用同一个ID的情况,你的XPath匹配规则会命中所有符合
id前缀要求的元素,未做去重处理的情况下自然会出现大量重复ID。你观察到的重复次数和ID长度关联的现象,大概率是网页前端渲染时的重复生成逻辑导致的。
解决方案
代码修改思路
- 在循环外部初始化空列表存储提取结果,循环内使用
append方法追加内容,避免覆盖历史结果。 - 提取ID数字可以直接用字符串切割,比正则匹配效率更高、逻辑更简单;如果需要去重,可根据是否要保留原有顺序选择对应方案。
修复后代码示例
import re # 原有元素定位逻辑不变 elements = driver.find_elements_by_xpath('//*[starts-with(@id, "number_") and not(contains(@id, "_name")) ]') print("List 2 length is:", len(elements)) # 方法1:无需保留原有顺序,直接去重 list_of_ids = [] for x in elements: id_val = x.get_attribute("id") # 字符串切割提取数字,比正则更简单 num = id_val.split("_")[1] # 若坚持用正则可替换为下行代码 # num = re.findall(r"\d+", id_val)[0] list_of_ids.append(num) # 用集合去重 list_of_ids = list(set(list_of_ids)) # 方法2:需要保留元素原有顺序的有序去重方案 list_of_ids = [] seen = set() for x in elements: id_val = x.get_attribute("id") num = id_val.split("_")[1] if num not in seen: seen.add(num) list_of_ids.append(num)
内容的提问来源于stack exchange,提问作者Aeternus
相关产品推荐
相关产品推荐

