如何在html上获取所有元素名称(我的错误代码运行循环)

时间:2015-10-17 08:44:13

标签: go

我想获得一个文档树。 然后,首先,我显示所有元素名称。 但我的代码运行循环。 我该怎么办?

package main

import (
    "github.com/PuerkitoBio/goquery"
    "golang.org/x/net/html"
)

func getTagName(s *goquery.Selection) {
    for _, n := range s.Nodes {
        if n.Type != html.ElementNode {
            continue
        }
        println(n.Data)
        getTagName(s.Children())
    }
}

func main() {
    doc, _ := goquery.NewDocument("https://news.ycombinator.com/")
    doc.Find("html body").Each(func(_ int, s *goquery.Selection) {
        getTagName(s)
    })
}

1 个答案:

答案 0 :(得分:1)

似乎可以解决这个问题:

package main

import (
    "os"

    "github.com/PuerkitoBio/goquery"
    "golang.org/x/net/html"
)

var areWeLooping = make(map[*goquery.Selection]struct{})

func getTagName(s *goquery.Selection) {
    if _, weAreLooping := areWeLooping[s]; weAreLooping {
        println("loop detected")
        os.Exit(1)
    }

    areWeLooping[s] = struct{}{}

    for _, n := range s.Nodes {
        if n.Type != html.ElementNode {
            continue
        }
        println(n.Data)
    }

    s.Children().Each(func(_ int, s *goquery.Selection) {
        getTagName(s)
    })
}

func main() {
    doc, _ := goquery.NewDocument("https://news.ycombinator.com/")
    doc.Find("html body").Children().Each(func(_ int, s *goquery.Selection) {
        getTagName(s)
    })
}

在循环中使用getTagName(s.Children())会导致麻烦。