a 标签怎么写:搜索引擎只读 href、文字和两种兜底

a 标签上被搜索引擎读的只有三处:带 href 的元素、标签之间的文字、以及文字缺席时官方点名的两种兜底。三处各自会坏,坏法也不一样。

抓取与收录6 分钟读完1721 次阅读
a 标签怎么写:搜索引擎只读 href、文字和两种兜底

搜索引擎读一个 a 标签,只读三处:元素本身是不是带 href<a>、标签之间那几个字、以及文字缺席时的两种兜底。这三处各自会坏,坏法也不一样——写得再准的锚文本,只要没有 href,那就不是一条链接;能跟得动但一个字都没有的链接,则等于没告诉爬虫它通向哪儿。

开始之前

这一篇讲的不是 target="_blank" 怎么开新窗口,也不是下载属性怎么用,而是同一个 a 标签上被搜索引擎读的那几个位置。至于哪一页该链哪一页、孤岛页怎么找,是站点结构的问题,写在 网站结构其实只由内链决定 里。本篇往下一层,只看元素本身。

Google 在一个 a 标签上读哪几处

三处,而且有固定的优先级。《Make your links crawlable》(2026-08-28 抓取)开头就是元素规则:「Generally, Google can only crawl your link if it's an <a> HTML element (also known as anchor element) with an href attribute.」接着是锚文本,最后是锚文本为空时的两种兜底:title 属性,以及链接包着图片时那张图的 alt

要求缺了会怎样
元素href<a>不当链接抓
href 值一个地址,不是 javascript:…官方只说「可能仍会尝试」
文字标签之间的字退到 title
图片链接内层图的 alt没有任何可读的名字

优先级在批量返工时很要命。一个只写了 aria-label 的图标链接,读屏软件读得出来,搜索侧却没有任何有文档依据的名字——那一页里从头到尾没有出现过 aria-label。给它内层的图补一个 alt,页面上一个像素都不用动,搜索侧就有名字了。

href 决定这条链接存不存在,文字决定它值多少。

锚文本怎么写才经得起单独读

官方给了一条自测,每条链接花两秒:「Try reading only the anchor text (out of context) and check if it's specific enough to make sense by itself. If you don't know what the page could be about, you need more descriptive anchor text.」把锚文本从句子里单独拎出来读,看得懂它指向哪儿才算过。

「了解更多」不过。「点这里」不过。「GPTBot 的完整 UA 串」过,「我们 2026 年的退款政策」也过。同一页把两个方向的毛病都点了名:一头是太笼统,另一头是 weirdly long——整句话被塞进链接里。中文写作里第二种更常见,因为中文本来就不习惯在句中断开。

动手:一页六步

一次只处理一个页面,按这个顺序。前三步是把「给不了爬虫任何东西」的链接挑出来,后三步是把已经能用的那些写得更准。

  1. 列出这一页所有锚点,标两种情况:没有 href 属性,以及压掉空白后没有文字。用下面那段脚本,或者浏览器控制台。
  2. 被标出来的锚点里,凡是包着图片的,给那张图写 alt,写它通向哪儿,不是写图里有什么。文章缩略图的 alt 应该是那篇文章的标题。
  3. 被标出来的锚点里,凡是控件的——菜单触发器、投票按钮、轮播箭头——不要动它,但要确认它背后的落地页在站内别处还有一条正常链接。
  4. 有文字的锚点,逐条过一遍单独读的自测。不过的重写,用三到六个词点名目的地。
  5. 超过 100 个字符的锚文本,砍到只剩点名的那一段。剩下的话留在句子里——官方明确要求把上下文留在链接外面。
  6. 检查有没有同一段锚文本指向两个不同页面,或者同一个页面被三种说法链过去。一个目的地,一种说法。

第六步最容易被跳过,而它是会累积的那一步。如果三个页面分别用「价格」「套餐」「看看多少钱」链到同一个定价页,每种说法只承担了三分之一的描述;一个想搞清这一页是什么的答案引擎,拿到的是三个残缺的名字而不是一个完整的。挑读者真会搜的那一个说法,然后每次都用它。锚文本换着花样写不是文风问题,是把同一份信号拆成三份花掉。

交付物:审计脚本与自查表

下面这段会把线上任意一页里「给不了爬虫任何东西」的锚点全列出来——没有 href 的,或者既没有文字、内层图也没有 alt 的。只需要 Python 3,不装任何库。

import sys, urllib.request
from html.parser import HTMLParser

class Links(HTMLParser):
    def __init__(self):
        super().__init__(convert_charrefs=True)
        self.rows, self.cur = [], None
    def handle_starttag(self, tag, attrs):
        a = dict(attrs)
        if tag == "a":
            self.cur = {"href": a.get("href"), "text": "",
                        "aria": (a.get("aria-label") or "").strip(),
                        "img": (a.get("title") or "").strip()}
        elif tag == "img" and self.cur is not None:
            self.cur["img"] = (a.get("alt") or "").strip()
    def handle_data(self, d):
        if self.cur is not None:
            self.cur["text"] += d
    def handle_endtag(self, tag):
        if tag == "a" and self.cur is not None:
            self.rows.append(self.cur)
            self.cur = None

req = urllib.request.Request(sys.argv[1], headers={"User-Agent": "Mozilla/5.0"})
page = urllib.request.urlopen(req, timeout=30).read().decode("utf-8", "replace")
p = Links()
p.feed(page)
bad = 0
for r in p.rows:
    named = r["text"].strip() or r["img"]
    if r["href"] is None or not named:
        bad += 1
        why = "no href" if r["href"] is None else "no text"
        print(f'{why:8} {(r["text"].strip() or r["aria"] or "")[:40]:40} {(r["href"] or "")[:50]}')
print(f'{bad} of {len(p.rows)} anchors give a crawler nothing')

存成 linkcheck.py,跑 python3 linkcheck.py https://你的站点/。它只读服务器返回的 HTML,这正是重点:它看到的就是爬虫在任何脚本跑起来之前看到的那份。

查什么过的条件
元素每个要被收录的去处都是 <a href>
空文字为 0,或每条都有图片 alt
单独读锚文本本身点得出目的地
长度三到六个词,不是整句
一致性一个目的地一种说法
相邻两条链接中间要有字

三种常见的写坏

这三种都在真实站点上见得到,而且在浏览器里看起来一点毛病都没有。

  1. 下拉菜单的触发器本来就不是链接。它没有 href 是设计如此,对触发器没问题;但如果它展开后的那些页面在站内别处一次都没出现过,那些页面就只能靠猜被发现。改菜单之前先看页脚和站点地图。
  2. 只写了 aria-label 的图标链接,能过无障碍检查,却在搜索侧留下一个没有名字的链接,因为官方点名的兜底是 title 和图片 altaria-label 该留就留,把 alt 补上。
  3. 锚文本超过 100 个字符,通常意味着整条标题或整段话被包进了链接。官方要求把上下文留在链接外面;几条链接连着排、中间不夹字,每一条都会因此丢掉自己的上下文。

这一篇管不到的地方

这一篇有三处明确不适用。锚文本救不了一个爬虫压根到不了的页面,它也说不准单条链接到底值多少。官方文档只描述它读什么,没有公布权重,任何给你一个数字的清单都是编的。如果你的问题是页面没被收录,先往上一层查可达性,用 AI 爬虫可达性检查:先确认请求到得了,再谈措辞。另外,本篇默认讲的是编辑性链接;付费链接和用户生成内容里的链接要用 rel 标注,那是另一页的规则。

常见问题

锚文本写多长合适?

官方没给数字,只给了两个要躲开的方向:太笼统,和 weirdly long。三到六个词能点清大多数目的地,剩下的交给单独读那条自测。

内链里要不要每条都塞目标关键词?

不要。同一页把关键词堆砌列为违反垃圾内容政策,并反问「读者是不是真的需要这些词才能理解下一页」。一致性比重复更管用:一个目的地一种说法,放在句子里读着顺就行。

图标链接只写 aria-label 够不够?

对读屏软件够。对搜索引擎,官方讲链接文字那一页没有点名它,点名的两种兜底是 title 和内层图的 alt。27 个首页的实测里,只有 aria-label 的链接 恰恰是没有文字的链接中最常见的一种。

JavaScript 插进来的链接算不算?

官方说只要最终落成 <a href> 的写法就仍然可抓。上面那段脚本看不见它们,这类要用网址检查工具看渲染后的 HTML 才算数。

javascript: 开头的链接现在还常见吗?

官方仍把它列在不推荐里,但实际已经很少见了:27 个首页 5,272 个锚点的实测 里,这种写法一条都没有。时间花在空锚文本上更划算。

本文属于 QueryWin 实操手册 · 第 2 阶

a 标签怎么写:搜索引擎只读 href、文字和两种兜底