1 回答

TA貢獻(xiàn)1765條經(jīng)驗(yàn) 獲得超5個(gè)贊
您的代碼不起作用,因?yàn)樗捎梦臋n的第一個(gè)子元素,即元素,然后它采用其同級(jí)元素,從而導(dǎo)致函數(shù)以空的鏈接片結(jié)尾。htmlnil
詳細(xì)解釋:下面是一個(gè)示例代碼,
package main
import (
"fmt"
"log"
"strings"
"golang.org/x/net/html"
)
var i int = 0
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)
}
}
}
if i == 0 {
i++
return visit(links, n.FirstChild)
}
return visit(links, n.NextSibling)
}
func main() {
s := `<p>Links:</p><ul><li><a href="foo">Foo</a><li><a href="/bar/baz">BarBaz</a></ul>`
doc, err := html.Parse(strings.NewReader(s))
if err != nil {
log.Fatal(err)
}
links := visit([]string{}, doc)
fmt.Println(links)
}
第一次調(diào)用訪問,
參數(shù):
鏈接 = []
n = DocumentNode
在第一次調(diào)用中,i=0,因此它使用文檔節(jié)點(diǎn)的第一個(gè)子節(jié)點(diǎn)進(jìn)行遞歸調(diào)用。visit
第二次訪問調(diào)用,
參數(shù):
鏈接 = []
n = ElementNode (n.Data = “html”)
在第二次調(diào)用中,是元素節(jié)點(diǎn)?,F(xiàn)在,對(duì) 元素節(jié)點(diǎn)的下一個(gè)同級(jí)節(jié)點(diǎn)進(jìn)行第三次調(diào)用。這就是問題所在。元素節(jié)點(diǎn)沒有同級(jí),因此將是 。nhtmlvisithtmlhtmlnnil
第三次調(diào)用訪問,
參數(shù):
鏈接 = []
n = nil
因此,現(xiàn)在所有以遞歸方式調(diào)用的函數(shù) 3 函數(shù)調(diào)用都將返回,并且執(zhí)行流將返回到,因此切片將保持為空。mainlinks
希望您理解。
編寫此功能的正確方法是通過您在問題中共享的循環(huán),如下所示,
package main
import (
"fmt"
"log"
"strings"
"golang.org/x/net/html"
)
func visit(links []string, n *html.Node) []string {
if n.Type == html.ElementNode && n.Data == "a" {
for _, a := range n.Attr {
if a.Key == "href" {
links = append(links, a.Val)
}
}
}
for c := n.FirstChild; c != nil; c = c.NextSibling {
links = visit(links, c)
}
return links
}
func main() {
s := `<p>Links:</p><ul><li><a href="foo">Foo</a><li><a href="/bar/baz">BarBaz</a></ul>`
doc, err := html.Parse(strings.NewReader(s))
if err != nil {
log.Fatal(err)
}
links := visit([]string{}, doc)
fmt.Println(links)
}
在這里,循環(huán)通過檢查每個(gè)HTML元素的子元素來幫助遞歸地查找鏈接。如果其中一個(gè)HTML元素沒有同級(jí)元素,那么它將簡(jiǎn)單地移動(dòng)到其父級(jí)的下一個(gè)同級(jí)元素并檢查
- 1 回答
- 0 關(guān)注
- 89 瀏覽
添加回答
舉報(bào)