独立站图片 alt 怎么查要处理的不是商品效果,而是一类可以由程序明确判断的输入问题。用标准库HTMLParser解析img标签,不用正则匹配整份HTML。装饰图采用空alt并显式声明presentation角色;信息图缺少或空白alt进入报告。
独立站图片 alt 怎么查要处理的不是商品效果,而是一类可以由程序明确判断的输入问题。用标准库HTMLParser解析img标签,不用正则匹配整份HTML。装饰图采用空alt并显式声明presentation角色;信息图缺少或空白alt进入报告。
输入契约与实现
用标准库HTMLParser解析img标签,不用正则匹配整份HTML。装饰图采用空alt并显式声明presentation角色;信息图缺少或空白alt进入报告。

代码把HTML图片描述检查限定成小范围任务,刻意不增加网络请求、文件覆盖和发布动作。
运行结果与排错
有实际内容描述的信息图和明确装饰图通过;缺alt进入empty_alt报告;两张使用相同商品图描述的图片进入repeated复核组。
重复描述是复核线索而非一定错误。程序无法看见图中内容,不能认定描述准确,更不能为图片补写商品事实。如果要扩大范围,先添加对应失败夹具,再修改实现。
成功分支同样要验证结果含义。
放在图片制作链路的哪里
这个工具适合放在alt检查工具相关的本地资料整理环节,和图像制作保持解耦。
实际交接至少保留输入版本、代码版本和完整报告。
本例的覆盖范围是:有实际内容描述的信息图和明确装饰图通过;缺alt进入empty_alt报告;两张使用相同商品图描述的图片进入repeated复核组。未覆盖的边界是:重复描述是复核线索而非一定错误。程序无法看见图中内容,不能认定描述准确,更不能为图片补写商品事实。
from html.parser import HTMLParser
import json
class AltChecker(HTMLParser):
def __init__(self):
super().__init__(convert_charrefs=True)
self.issues = []
self.descriptions = {}
def handle_starttag(self, tag, attrs):
if tag != 'img':
return
attrs = dict(attrs)
src = attrs.get('src', '')
alt = attrs.get('alt')
if attrs.get('role') == 'presentation' and alt == '':
return
if alt is None or not alt.strip():
self.issues.append({'src': src, 'reason': 'empty_alt'})
return
self.descriptions.setdefault(alt.strip(), []).append(src)
def report(self):
repeated = {k: v for k, v in self.descriptions.items() if len(v) > 1}
return {'issues': self.issues, 'repeated': repeated}
def check(html):
parser = AltChecker()
parser.feed(html)
parser.close()
return parser.report()
good = '<img src="a.png" alt="杯盖打开,饮口位于右侧"><img role="presentation" alt="" src="line.png">'
bad = '<img src="a.png"><img src="b.png" alt="商品图"><img src="c.png" alt="商品图">'
assert check(good) == {'issues': [], 'repeated': {}}
report = check(bad)
assert len(report['issues']) == 1
assert report['repeated']['商品图'] == ['b.png', 'c.png']
print(json.dumps({'success': check(good), 'errors': report}, ensure_ascii=False))
编辑复核与下一组测试
阅读HTMLParser产生的报告时,先区分empty_alt与repeated的处理目标。缺少alt或alt只有空白,意味着信息图没有提供本例要求的文字描述;两张图片使用同样描述进入repeated组,则只是提示编辑比较它们是否表达同一内容,不能按重复文本直接删除其中一张。定位empty_alt时应把对应img标签和页面中的图片位置一起交给内容编辑,核对这是商品整体图、局部图还是装饰元素,再决定填写描述或调整标记。本文允许明确采用presentation角色且alt为空的装饰图通过,这不意味着给所有缺描述图片补上presentation就能完成审核;如果该图承担规格、包装或操作信息,把它归为装饰图会绕开原本要暴露的缺口。重复组也有两种不同的复核方向:同一商品图片在不同区域重复引用,文字相同可能合理;整体图和细节图沿用同一句描述,则需要看细节是否有独立信息。程序不能看见图像,因此这些判断应由查看素材的人完成,报告只负责把候选对象聚在一起。下一组夹具可分别加入完全缺失alt、空字符串、仅空格的alt,以及空alt但没有presentation的图片,确认信息图与装饰图的分界;还可对两张同描述图片和两张不同描述图片分别建立对照,防止重复组被误当作所有图片的合格性结论。对于一张已有文字描述的信息图,可再用明显泛化的描述做人工复核样本,展示非空文本通过与描述准确是不同层次,不应期待检查器从非空字符串推断商品事实。交接时最好保留报告对应的HTML片段,而不是只发图片文件名,因为同一素材在不同页面位置可能承担不同用途,编辑需要依据页面上下文处理。若检查输入只是页面模板,应另外确认实际交付页面所使用的HTML是否包含同样的img和属性;不能把模板检查结果直接替代渲染后页面的核对。这个环节放在页面内容编辑完成、上线审阅之前最有价值:先解决empty_alt的明确缺口,再逐组解释repeated是否需要改写,最后由页面审核者查看文字与图中信息是否相符,避免为了消除重复提示而编造材质、数量或功能。