第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

涉及 *html 的遞歸函數(shù)。用于打印 HTML 文檔中所有鏈接的節(jié)點(diǎn)

涉及 *html 的遞歸函數(shù)。用于打印 HTML 文檔中所有鏈接的節(jié)點(diǎn)

Go
桃花長(zhǎng)相依 2022-08-30 15:01:07
我正在嘗試使用接受*html的函數(shù)打印HTML文檔中的所有鏈接。節(jié)點(diǎn)作為參數(shù)。我是Golang和*html的新手。節(jié)點(diǎn)數(shù)據(jù)類型,我以前從未使用過它們。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)}檢查是否的 if 塊的目的是確保只運(yùn)行一次(第一次)并在后續(xù)迭代中運(yùn)行。但是,從不追加,并且始終返回空切片。我不明白代碼中的錯(cuò)誤。i==0return visit(links, n.FirstChild)return visit(links, n.NextSibling)links使用 for 循環(huán)時(shí),代碼工作正常,但當(dāng)我嘗試使用遞歸時(shí),代碼會(huì)中斷。for c := n.FirstChild; c != nil; c = c.NextSibling {        links = visit(links, c)    }
查看完整描述

1 回答

?
POPMUISE

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í)元素并檢查


查看完整回答
反對(duì) 回復(fù) 2022-08-30
  • 1 回答
  • 0 關(guān)注
  • 89 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)