商品页更新后,可以按明确旧图清单扫描 HTML 中的 src 与 srcset,找出仍被引用的旧文件。下面用浏览器DOMParser解析,不靠正则猜标签。扫描范围限于img和source,不覆盖CSS背景或脚本动态加载,因此结果应叫已扫描范围的残留引用,而不是全站旧图已经清零。
商品页更新后,可以按明确旧图清单扫描 HTML 中的 src 与 srcset,找出仍被引用的旧文件。下面用浏览器DOMParser解析,不靠正则猜标签。扫描范围限于img和source,不覆盖CSS背景或脚本动态加载,因此结果应叫已扫描范围的残留引用,而不是全站旧图已经清零。
例如图片已经换成本地新版本,某个推荐模块的srcset却保留旧链接。正常屏幕上可能显示新src,高密度或不同条件下仍会选旧项。更新确认不只看主图加载,而要检查所有已知引用,且让链接关联具体商品版本。
使用明确的页面基址
函数接收HTML、baseUrl与oldUrls。相对链接由new URL按传入基址解析,旧清单先转换为绝对地址,再比较。页面内的base标签不会改变本函数的基址,调用者需要传入实际希望核对的地址。不要让未知页面元素替扫描器决定去哪找图片。

export function findOldImages(html,baseUrl,oldUrls) {
const base=new URL(baseUrl);
const old=new Set(oldUrls.map(x=>new URL(x,base).href));
const doc=new DOMParser().parseFromString(html,'text/html');
const findings=[];
for (const node of doc.querySelectorAll('img,source')) {
const refs=[];
if (node.hasAttribute('src')) refs.push(node.getAttribute('src'));
const srcset=node.getAttribute('srcset')||'';
// This minimal example supports normal URL + descriptor entries, not data URLs.
if (srcset.includes('data:')) throw Error('data URL srcset unsupported');
refs.push(...srcset.split(',').map(x=>x.trim().split(/\s+/)[0]).filter(Boolean));
for (const raw of refs) {
const url=new URL(raw,base).href;
if(old.has(url)) findings.push({ tag:node.tagName.toLowerCase(),url });
}
}
return findings;
}
将模块放在本地静态服务中,在浏览器导入 findOldImages,传入已取得的页面源码。它不主动访问网站,不登录发布后台,也不更换引用。srcset解析仅支持普通URL加描述符的简化列表,含data URL时直接拒绝,避免逗号被误拆后得出假结果。
验证相对地址与多候选引用
本次在Edge无头浏览器中解析一个构造页面:img使用../old.png,source的srcset也带该相对地址。指定页面基址后,两处都解析为旧清单中的绝对URL,结果各有一条记录。另构造data URL srcset,函数按声明限制拒绝执行,未将它当成正常链接跳过。
查询参数和大小写按URL结果比较,不自作主张去掉。old.png?v=1与old.png?v=2可能对应不同资源策略,是否应合并由业务清单决定;程序不能为了找到更多旧图就删除版本信息。同样,返回两条记录可能来自同一URL的两个位置,它们不是重复错误,应分别确认。
页面脚本可能在加载后生成图片,此函数读取的源码未必包含这些节点。可以另在可信页面渲染完成后获取DOM再检查,但仍须说明范围;CSS背景、内联样式与第三方组件需要独立策略。示例没有证明某个真实线上网站全部更新,也没有跨域取页能力。
Picset图像素材进入商品页之后,[1] 版本清单可作为旧链接输入,帮助运营追踪替换范围;扫描器并不是Picset发布接口,也没有调用其后台。哪个URL属于旧包装,应来自资料与发布记录,不由脚本看图片判断。
发现残留后返回管理任务,保存位置、旧版本和替换结果。实际修改需要编辑器或部署流程完成,再重新扫描对应范围并预览页面。静态引用检查、页面视觉检查和业务事实确认各做一层,更新便不再只靠一张主图看起来已经变化的印象。