如何用GoQuery获取<h3>自身文本,排除内部<span>内容
问题:Go语言中如何仅获取
标签自身的文本(排除子元素内容)
原Go函数代码:
func getMosWantedInfo(doc *goquery.Document) { doc.Find("div.flex-align-center.bg-base-lightest.padding-1.margin-1").Each(func(i int, s *goquery.Selection) { // For each item found, get the title title := s.Find("h3").Text() reward := s.Find("span") // iamge := s.Find("imag") fmt.Println("###########") fmt.Printf("SUSPECT %d: Name: %s\n", i, title) fmt.Printf("SUSPECT %d REWARD: %s\n", i, reward) fmt.Println("-----------") }) // Handle what happens when doc.find doesnt find the article wanted }
补充示例HTML:
<div> <h3> <span>Text to avoid</span> Text to collect </h3> </div>
当前调用h3.Text()会返回Text to avoidText to collect,需要仅提取Text to collect部分。
解决方案
goquery的Text()方法会递归拼接当前节点及所有子节点的文本,要单独获取父节点自身的文本,需要筛选出h3下的文本节点(TextNode),排除元素节点。
修改后的代码如下:
import ( "strings" "golang.org/x/net/html" "github.com/PuerkitoBio/goquery" "fmt" ) func getMosWantedInfo(doc *goquery.Document) { doc.Find("div.flex-align-center.bg-base-lightest.padding-1.margin-1").Each(func(i int, s *goquery.Selection) { // 提取h3自身的文本内容 var title string s.Find("h3").Contents().Each(func(_ int, node *goquery.Selection) { // 判断节点类型是否为纯文本节点 if node.Get(0).Type == html.TextNode { // 清理多余空白后拼接 title += strings.TrimSpace(node.Text()) } }) reward := s.Find("span").Text() // 补充:原代码未取文本内容,此处添加.Text() // image := s.Find("img") // 修正原拼写错误:imag -> img fmt.Println("###########") fmt.Printf("SUSPECT %d: Name: %s\n", i, title) fmt.Printf("SUSPECT %d REWARD: %s\n", i, reward) fmt.Println("-----------") }) // 处理未找到目标元素的情况 if doc.Find("div.flex-align-center.bg-base-lightest.padding-1.margin-1").Length() == 0 { fmt.Println("未找到通缉嫌疑人信息。") } }
关键说明
- 用
Contents()获取h3下的所有子节点(包含文本节点和元素节点) - 通过
node.Get(0).Type == html.TextNode筛选出纯文本节点 - 用
strings.TrimSpace()清理文本中的换行、冗余空格,避免输出杂乱 - 修复原代码两处小问题:
reward未调用.Text()获取实际内容;imag拼写错误修正为img
内容的提问来源于stack exchange,提问作者David Meléndez
相关产品推荐
相关产品推荐

