Golang中如何解析HTML和获取标签?

Golang中如何解析HTML和获取标签? // 刚接触Go语言,试图理解为什么n的值为1。 // 非常感谢

func main()  {
var y int
fmt.Println(y) //0
n,err:=fmt.Scanf("%d\n", &y)
if err != nil{
log.Fatal(err)
}
fmt.Println("y =",y)// 打印y的值
fmt.Println("y+n =",y+n) // 不知为何打印出y的值加1,这个1是从哪里来的?n是布尔值吗?
fmt.Println("n",n) //1
fmt.Println("y =",y)

更多关于Golang中如何解析HTML和获取标签?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

非常感谢您的解释,我对此深表感激。

更多关于Golang中如何解析HTML和获取标签?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


为什么 n 的值为 1

n, err := fmt.Scanf("%d\n", &y)

func Scanf(format string, a ...interface{}) (n int, err error)

Scanf 扫描从标准输入读取的文本,根据格式字符串将连续的空格分隔值存储到连续的参数中。它返回成功扫描的项数。

https://golang.org/pkg/fmt/#Scanf

成功扫描了一个项 —— y

在Go语言中,fmt.Scanf的返回值n表示成功扫描的项目数量,而不是布尔值。在你的代码中,n为1表示成功扫描了1个整数到变量y中。

关于HTML解析,Go标准库提供了golang.org/x/net/html包。以下是解析HTML和获取标签的示例:

package main

import (
    "fmt"
    "golang.org/x/net/html"
    "strings"
)

func main() {
    // 示例HTML
    htmlStr := `<html>
        <body>
            <h1>标题</h1>
            <p class="content">段落内容</p>
            <a href="https://example.com">链接</a>
        </body>
    </html>`

    // 解析HTML
    doc, err := html.Parse(strings.NewReader(htmlStr))
    if err != nil {
        panic(err)
    }

    // 遍历所有节点
    var traverse func(*html.Node)
    traverse = func(n *html.Node) {
        if n.Type == html.ElementNode {
            fmt.Printf("找到标签: <%s>\n", n.Data)
            
            // 获取标签属性
            for _, attr := range n.Attr {
                fmt.Printf("  属性: %s=%q\n", attr.Key, attr.Val)
            }
        }
        
        // 递归遍历子节点
        for c := n.FirstChild; c != nil; c = c.NextSibling {
            traverse(c)
        }
    }
    
    traverse(doc)
}

输出:

找到标签: <html>
找到标签: <body>
找到标签: <h1>
找到标签: <p>
  属性: class="content"
找到标签: <a>
  属性: href="https://example.com"

如果需要提取特定标签,可以这样修改:

// 提取所有链接
func extractLinks(n *html.Node) []string {
    var links []string
    if n.Type == html.ElementNode && n.Data == "a" {
        for _, attr := range n.Attr {
            if attr.Key == "href" {
                links = append(links, attr.Val)
            }
        }
    }
    
    for c := n.FirstChild; c != nil; c = c.NextSibling {
        links = append(links, extractLinks(c)...)
    }
    
    return links
}

// 使用
links := extractLinks(doc)
fmt.Println("所有链接:", links)

对于更复杂的HTML操作,可以考虑使用第三方库如goquery

import "github.com/PuerkitoBio/goquery"

// 使用goquery示例
doc, err := goquery.NewDocumentFromReader(strings.NewReader(htmlStr))
if err != nil {
    panic(err)
}

// 查找所有p标签
doc.Find("p").Each(func(i int, s *goquery.Selection) {
    fmt.Printf("段落 %d: %s\n", i, s.Text())
})
回到顶部