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

使用Selenium提取网页id属性中数字部分时出现重复值问题

问题成因与解决方案

成因

  1. 仅返回单个数字结果的核心原因:list_of_ids被定义在循环内部,每次遍历元素时都会用当前元素的提取结果覆盖该变量,循环结束后仅保留最后一个元素的数字提取结果。
  2. ID重复出现的原因:你采集的目标网页不符合HTML ID唯一性规范,存在多个元素共用同一个ID的情况,你的XPath匹配规则会命中所有符合id前缀要求的元素,未做去重处理的情况下自然会出现大量重复ID。你观察到的重复次数和ID长度关联的现象,大概率是网页前端渲染时的重复生成逻辑导致的。

解决方案

代码修改思路

  1. 在循环外部初始化空列表存储提取结果,循环内使用append方法追加内容,避免覆盖历史结果。
  2. 提取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 15:57:03