用//a[@href]//text()提取a标签可见文本最稳,需.join()合并并strip()过滤空白;须预清理script/style/注释,避免误取;无文本时fallback至title或aria-label。

用 lxml + XPath 提取 a 标签的可见文本内容
直接取 a 标签内部的文本(即用户看到的“链接名称”),而不是 href 值,lxml 是 Python 中最稳且高效的选择。它能正确处理嵌套标签(比如 @#@#@#@#@#@#@#@#@#@0),而不会把“点击这里”拆成两段。
关键不是用 //a/text() —— 它只取直接子文本节点,会漏掉加粗、换行或 span 包裹的内容。应改用 //a//text(),再用 ''.join() 合并:
from lxml import etree
from html import unescape
<p>tree = etree.HTML(html_text)
for link in tree.xpath('//a[@href]'):
texts = [t.strip() for t in link.xpath('.//text()') if t.strip()]
name = ''.join(texts)
print(name)
</p>
- 必须加
[@href]过滤,否则会匹配到无 href 的@#@#@#@#@#@#@#@#@#@1),get_text()会把{{text}}当真文本返回,得先清洗 - 遇到
@#@#@#@#@#@#@#@#@#@2这类无文本链接,get_text()返回空字符串——需 fallback 到link.get('title') or link.get('aria-label')
为什么不用正则提取链接名称
正则根本没法可靠识别“哪段文本属于哪个 a 标签”。例如这段 HTML:
<a href="x">Hello</a> world <a href="y">Goodbye</a>
用 r'@#@#@#@#@#@#@#@#@#@3)、注释()、CDATA 或 script 内容
re.DOTALL,也无法区分同级多个 a 的归属范围提取前必须清理干扰块
真实网页里,<script></script>、、 里常藏有类似 这类伪链接,需额外按 class 过滤
真正难的不是“怎么取文本”,而是“怎么确认这段文本确实属于一个有效、可点击、非模板、非注释的 a 标签”——这一步漏掉,后面全白忙。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











