
本文介绍如何利用 goquery 库高效提取网页中真正对用户可见的纯文本内容,避免 css、javascript、注释等非渲染文本干扰,适用于爬虫、内容分析与无障碍测试等场景。
本文介绍如何利用 goquery 库高效提取网页中真正对用户可见的纯文本内容,避免 css、javascript、注释等非渲染文本干扰,适用于爬虫、内容分析与无障碍测试等场景。
在 Web 内容解析中,“可见文本”(visible text)指的是浏览器实际渲染并呈现给用户的文字内容——即
、
、 等标签内的可读文本,不包括
原生 golang.org/x/net/html 解析器虽底层强大,但需手动遍历节点、过滤 的内部文本)混入结果。
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
推荐方案:使用 GoQuery —— 一个类 jQuery 的 Go HTML 解析库,它基于 net/html 构建,并自动忽略 ,其 .Text() 方法返回的是经 DOM 渲染逻辑过滤后的“用户可见文本”。
✅ 正确用法示例
package main
import (
"fmt"
"log"
"github.com/PuerkitoBio/goquery"
)
func main() {
// 从 URL 加载文档(支持本地 HTML 字符串:goquery.NewDocumentFromReader)
doc, err := goquery.NewDocument("https://example.com")
if err != nil {
log.Fatal(err)
}
// 提取所有可见文本(全局可见内容,不含隐藏元素)
var visibleText string
doc.Find("body").Each(func(i int, s *goquery.Selection) {
visibleText = s.Text() // 自动剔除 style/script/comment 文本
})
fmt.Println("可见文本摘要(前200字符):",
fmt.Sprintf("%.200s", visibleText))
}
? 进阶:按选择器精准提取 + 处理隐藏元素
GoQuery 默认不渲染 CSS,因此无法动态识别 display: none;但可通过属性检测增强鲁棒性:
// 获取所有非隐藏的块级文本容器中的文本
doc.Find("p, h1, h2, h3, h4, h5, h6, li, td, th, div[style!='display:none'], span:not([style*='display:none'])").
FilterFunction(func(i int, s *goquery.Selection) bool {
// 可选:进一步排除 aria-hidden="true" 或 role="presentation"
return s.AttrOr("aria-hidden", "") != "true"
}).
Each(func(i int, s *goquery.Selection) {
text := s.Text()
if len(text) > 0 {
fmt.Printf("段落 %d: %q\n", i+1, strings.TrimSpace(text))
}
})
⚠️ 注意事项
- CSS 隐藏不可自动检测:GoQuery 不执行 CSS 引擎,display: none、visibility: hidden 等需结合属性或自定义规则过滤(如上例)。
- 编码与重定向:NewDocument 自动处理 HTTP 重定向和常见字符编码(如 UTF-8、GBK),但若页面声明错误,可先用 charset.NewReader 显式转码。
- 性能考量:对于超大页面,建议用 Find("body").Text() 一次性获取全部可见文本,比逐个 Find("h1").Each(...) 更高效。
- 本地 HTML 解析:若处理本地 HTML 字符串或 io.Reader,请用 goquery.NewDocumentFromReader(r io.Reader)。
✅ 总结
GoQuery 的 .Text() 是提取用户可见文本的首选方案:简洁、健壮、语义清晰。它天然屏蔽
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










