41 lines
668 B
Go
41 lines
668 B
Go
package scraper
|
|
|
|
import "golang.org/x/net/html"
|
|
|
|
func MatchNode(n1 *html.Node, n2 *html.Node) bool {
|
|
if n1.Data == n2.Data {
|
|
if len(n1.Attr) == 0 ||
|
|
len(n2.Attr) == 0 {
|
|
return false
|
|
}
|
|
for i, a1 := range n1.Attr {
|
|
a2 := n2.Attr[i]
|
|
return a1.Key == a2.Key
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func SearchNode(target *html.Node, n *html.Node) chan *html.Node {
|
|
ch := make(chan *html.Node)
|
|
var crawl crawlFunc
|
|
crawl = func(n *html.Node) {
|
|
if n.Type == html.ElementNode {
|
|
if MatchNode(target, n) {
|
|
ch <- n
|
|
}
|
|
}
|
|
c := n.FirstChild
|
|
for c != nil {
|
|
crawl(c)
|
|
c = c.NextSibling
|
|
}
|
|
}
|
|
go func() {
|
|
defer close(ch)
|
|
crawl(n)
|
|
}()
|
|
return ch
|
|
}
|
|
|