Python使用list.remove()删除列表元素提示x not in list报错
问题原因
list.remove(x): x not in list 报错的唯一触发条件,是调用remove方法的瞬间,列表内不存在和传入参数字符级完全相等的元素。你遇到的问题本质是三个认知偏差:
- 你硬编码的待删除静态资源链接,和页面实际返回的img src并非完全一致:Steam的静态资源链接会动态拼接版本参数(比如你写死的
logo_steam.svg?t=962016,后面的t值会随前端版本更新变化),部分CDN域名也可能根据访问地区切换,只要字符串有一个字符差异,全值匹配就会失败。 - 你确认元素存在的依据不成立:你大概率是用浏览器打开页面看到了对应元素,但代码里的requests请求默认携带的User-Agent是
python-requests/版本号,Steam识别到爬虫请求时会返回结构简化的页面,根本不会返回所有浏览器端能看到的静态资源,缺任意一个待删链接时,对应remove调用就会报错。 - 就算你补了正常浏览器的请求头,Steam也会根据访问地区、账号登录状态、AB测试分组返回略有差异的DOM结构,无法保证每次请求都能拿到你列的全部10个静态资源链接。
修复方案
不要硬编码全链接做精确匹配删除,改用关键词过滤逻辑,从根源上避免匹配失败、元素缺失导致的报错:
- 先把所有要排除的无关资源的唯一特征关键词列出来,不用写全路径、不用管动态拼接的参数
- 遍历图片链接的时候直接过滤掉命中排除关键词的链接,省去先全量收集再逐个删除的步骤
- 如果一定要保留先收集后删除的逻辑,每次调用remove前必须先判断元素是否存在于列表中,禁止直接调用remove
修正后可直接运行的代码
import requests from bs4 import BeautifulSoup def GRS(): rust_skins_url = 'https://store.steampowered.com/itemstore/252490/browse/?filter=Limited' # 配置正常浏览器的请求头,避免被反爬返回简化页面 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36' } # 定义要排除的无关资源关键词,无需写全路径 exclude_keywords = [ 'blank.gif', 'footerLogo_valve_new.png', 'ico_facebook.gif', 'ico_twitter.gif', 'throbber.gif', 'logo_steam.svg', 'header_menu_hamburger.png', 'logo_steam_footer.png', 'header_logo.png', 'logo_valve_footer.png' ] TWS = [] r = requests.get(rust_skins_url, headers=headers, timeout=10) soup = BeautifulSoup(r.text, 'html.parser') images = soup.find_all('img') for image in images: src = image.get('src', '') # 链接不包含任何排除关键词时,才加入结果列表 if not any(keyword in src for keyword in exclude_keywords): TWS.append(src) return TWS Skins = GRS() print(Skins)
如果你坚持要使用先收集全量链接再逐个删除的写法,必须给每个remove操作加存在性判断,示例写法:
target = 'https://store.cloudflare.steamstatic.com/public/images/blank.gif' if target in TWS: TWS.remove(target)注意这种写法依然解决不了硬编码全链接无法匹配动态参数的问题,优先使用关键词过滤的方案。
内容的提问来源于stack exchange,提问作者ThatOneGamer
相关产品推荐
相关产品推荐

