
本文介绍在 Go 中借助 goquery 库提取 后或 标签外的裸露文本(如“India,Kolhapur”“12th”),通过 Text() 方法结合字符串处理实现高精度内容抽取。
本文介绍在 go 中借助 goquery 库提取 `
` 后或 `` 标签外的裸露文本(如“india,kolhapur”“12th”),通过 `text()` 方法结合字符串处理实现高精度内容抽取。
在网页爬虫或数据清洗场景中,常遇到关键信息未被独立 HTML 标签包裹的情况——例如 Education
12th 中的 "12th" 仅是
后的兄弟文本节点,无法通过 .Find("br").Next() 直接获取(因 Next() 匹配的是元素节点,而非文本节点)。goquery 的 Selection.Text() 方法会递归提取当前节点及其所有后代节点的全部可见文本(不含 HTML 标签),这正是解决该问题的核心突破口。
✅ 推荐方案:利用 Text() + 字符串裁剪
观察目标 HTML 片段:
<p align="justify"><b>Name</b>Priyaka</p> <p align="justify"><b>Eduction</b><br>12th</p>
每段
内, 中的内容(如 "Name"、"Eduction")是前缀,其后的纯文本(如 "Priyaka"、"12th")即所需目标。因此可按以下步骤提取:
- 定位所有带 align="justify" 的
元素;
- 对每个
,先用 s.Find("b").Text() 获取加粗前缀;
- 调用 s.Text() 获取整段完整文本;
- 使用 strings.TrimPrefix() 剥离前缀,剩余部分即为所求纯文本。
完整可运行示例代码如下:
立即学习“前端免费学习笔记(深入)”;
package main
import (
"fmt"
"strings"
"github.com/PuerkitoBio/goquery"
)
func main() {
html := `
<div class="container">
<div class="row">
<div class="col-lg-8">
<p align="justify"><b>Name</b>Priyaka</p>
<p align="justify"><b>Surname</b>Patil</p>
<p align="justify"><b>Adress</b><br>India,Kolhapur</p>
<p align="justify"><b>Hobbies </b><br>Playing</p>
<p align="justify"><b>Eduction</b><br>12th</p>
<p align="justify"><b>School</b><br>New Highschool</p>
</div>
</div>
</div>`
doc, err := goquery.NewDocumentFromReader(strings.NewReader(html))
if err != nil {
panic(err)
}
var results []string
doc.Find(".container").Find("[align=\"justify\"]").Each(func(_ int, s *goquery.Selection) {
boldText := strings.TrimSpace(s.Find("b").Text()) // 如 "Name", "Eduction"
fullText := strings.TrimSpace(s.Text()) // 如 "NamePriyaka", "Eduction12th"
// 注意:若存在换行/空格干扰,可先 Normalize 空白(可选)
cleanFull := strings.Join(strings.Fields(fullText), " ")
cleanBold := strings.Join(strings.Fields(boldText), " ")
result := strings.TrimPrefix(cleanFull, cleanBold)
if result != "" {
results = append(results, strings.TrimSpace(result))
}
})
fmt.Println("Extracted text:", results)
// Output: Extracted text: [Priyaka Patil India,Kolhapur Playing 12th New Highschool]
}⚠️ 注意事项与进阶建议
- 空格与换行处理:Text() 返回的字符串可能包含多余空白或换行符,建议配合 strings.TrimSpace() 或 strings.Fields() 进行标准化;
-
前缀唯一性保障:TrimPrefix 要求前缀严格匹配开头。若
中 后存在空格(如 Name Priyaka),需在 boldText 中保留该空格,或统一规范化;
-
更鲁棒的定位方式:若结构复杂(如
后文本需单独提取),可改用 Contents() 遍历子节点,判断 Node.Type == html.TextNode 并跳过 和
节点,但代码复杂度显著上升; - 性能考量:Each() 是同步遍历,适用于中小规模 HTML;对海量页面,建议结合 goroutine 池控制并发,但需注意 goquery.Selection 非线程安全,不可跨 goroutine 复用。
掌握 Text() 的语义本质(聚合所有后代文本)并辅以精准的字符串操作,即可优雅应对绝大多数“无标签裸文本”抽取需求——无需依赖 XPath 或底层 html.Node 遍历,简洁、高效、符合 Go 的实用主义哲学。











