包起来,爬虫就能识别——错。非标爬虫(如政务采集器、论文聚合器、比价机器人)根本不解析class名或CSS,它们只靠硬规则匹配语义标签。没<main></main>,就等于没入口;<main></main>为空、嵌套在<footer></footer>里、或页面出现两次,都会触发结构冲突,整块内容被降权甚至跳过。
  • SPA 页面必须服务端渲染出非空<main></main>,仅留<div id="root"></div>等同于告诉爬虫“这里没主内容”
  • 登录弹窗、广告位、客服电话塞进<main></main>→ 被判为“元信息污染”,主内容可信度下降
  • 检查方式:在浏览器 Console 执行document.querySelector('main'),返回 null 或多个节点即不合格

不是视觉分块,而是独立建模单元

<section></section>在非标采集逻辑里,不是用来“分栏”或“加边框”的,而是标记一个可被单独索引、富摘要展示、甚至 RSS 抓取的内容单元。它必须自带语义锚点,否则会被直接忽略。

  • 每个<section></section>必须以<h2></h2>起始,或带aria-labelledby;纯<section><p>...</p><div class="aritcle_card flexRow"> <div class="artcardd flexRow"> <a class="aritcle_card_img" href="/xiazai/skill10246" title="HTML Text Extract"><img src="https://img.php.cn/upload/skill/001/246/273/6adaf20dee630206.jpg" alt="HTML Text Extract" ></a> <div class="aritcle_card_info flexColumn"> <a href="/xiazai/skill10246" title="HTML Text Extract">HTML Text Extract</a> <p>从HTML页面(URL、文件或标准输入)中提取主体内容文本,去除导航、页脚、广告和模板文本。可直接传递给readability_check或其他文本工具。</p> </div> <a href="/xiazai/skill10246" title="HTML Text Extract" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div></section>不参与主题建模
  • 新闻列表页应为每条新闻套一层<section></section>,而非整个列表只包一个——否则爬虫当成“一篇长文”,而非“10篇独立报道”
  • 连续5个无标题的<section></section>,多数采集器会直接跳过该区域

“2024年3月15日”对爬虫只是普通字符串,需靠 NLP 推断,而<time datetime="2024-03-15">2024年3月15日</time>自带标准格式属性,Google 新闻类页面据此提升时效性排序权重。非标爬虫更严格:缺<time></time>,就无法提取发布时间,整条记录常被丢弃。

立即学习“前端免费学习笔记(深入)”;

  • datetime值必须符合 ISO 8601 格式(如2024-03-15T14:30:00+08:00),不能是中文或自定义格式
  • 文章页至少一处<time></time>,商品页建议同时标注上架时间与更新时间
  • 用document.querySelectorAll('time[datetime]').length快速验证是否缺失

W3C Validator + Lighthouse 是最低成本的质量守门员

人工检查容易漏掉嵌套违规(比如<main></main>放在<nav></nav>里)或属性缺失(如<img alt="HTML语义化在大数据抓取中的代码质量评估标准" >缺alt),工具能覆盖绝大多数结构性硬伤。

  • W3C Validator(https://validator.w3.org/nu/)查语法与嵌套合法性,重点看“Error: Element main not allowed as child of element nav”这类提示
  • Lighthouse 的 “Document structure” 审计项直接模拟爬虫逻辑,失败项基本对应非标采集器拒收点
  • CI/CD 中集成htmlhint,配置规则attr-req-alt、headings、id-unique,报错即阻断上线
实际落地时最容易被忽略的,是<main></main>的“唯一性”和“非空性”必须同时满足——它不是摆设,而是非标爬虫启动解析的开关。一旦关掉,后面所有语义标签都失去意义。