修改findlinks代码中遍历n.FirstChild链表的部分,将循环调用visit,改成递归调用。
func visit(links []string, n *html.Node) []string {
if n == nil {
return links
}
if n.Type == html.ElementNode && n.Data == "a" {
for _, a := range n.Attr {
if a.Key == "href" {
links = append(links, a.Val)
}
}
}
links = visit(links, n.NextSibling)
links = visit(links, n.FirstChild)
return links
}
编写函数,记录在HTML树中出现的同名元素的次数。
package main
import (
"fmt"
"os"
"golang.org/x/net/html"
)
type NodeCount map[string]int
func main() {
doc, err := html.Parse(os.Stdin)
if err != nil {
fmt.Fprintf(os.Stderr, "findlinks1: %v\n", err)
os.Exit(1)
}
nodeCount := NodeCount{}
fill(&nodeCount, doc)
fmt.Printf("%v", nodeCount)
}
func fill(nc *NodeCount, cn *html.Node) {
if cn.Type == html.ElementNode {
(*nc)[cn.Data]++
}
for next := cn.FirstChild; next != nil; next = next.NextSibling {
fill(nc, next)
}
}
编写函数输出所有text结点的内容。注意不要访问