From 55a6a4d3ef7d6a7d57428afd94c29b9dd827eb75 Mon Sep 17 00:00:00 2001 From: potassium Date: Fri, 16 Jan 2026 01:13:53 +0300 Subject: [PATCH] MatchElemAttr func implementation --- match.go | 38 ++++++++++++++++++++++++++++++++++++++ match_test.go | 26 ++++++++++++++++++++++++++ scraper_test.go | 6 +++--- 3 files changed, 67 insertions(+), 3 deletions(-) create mode 100644 match.go create mode 100644 match_test.go diff --git a/match.go b/match.go new file mode 100644 index 0000000..bc570bb --- /dev/null +++ b/match.go @@ -0,0 +1,38 @@ +package scraper + +import ( + "errors" + "slices" + "strings" + + "golang.org/x/net/html" + "golang.org/x/net/html/atom" +) + +var body = &html.Node{ + Type: html.ElementNode, + Data: "body", + DataAtom: atom.Body, +} + +var ErrNotAnElementNode = errors.New("not an ElementNode") + +func MatchElemAttr(s string, n2 *html.Node) (bool, error) { + r := strings.NewReader(s) + n, err := html.ParseFragment(r, body) + if err != nil { + return false, err + } + n1 := n[0] + + if !(n1.Type == html.ElementNode && + n2.Type == html.ElementNode) { + return false, ErrNotAnElementNode + } + + if n1.Data == n2.Data && + slices.Equal(n1.Attr, n2.Attr) { + return true, nil + } + return false, nil +} diff --git a/match_test.go b/match_test.go new file mode 100644 index 0000000..1e1111b --- /dev/null +++ b/match_test.go @@ -0,0 +1,26 @@ +package scraper + +import ( + "strings" + "testing" + + "golang.org/x/net/html" +) + +const fragment = `
` + +func TestMatchElemAttr(t *testing.T) { + n, err := html.ParseFragment(strings.NewReader(fragment), body) + if err != nil { + t.Error(err) + } + n1 := n[0] + + result, err := MatchElemAttr(fragment, n1) + if err != nil { + t.Error(err) + } + if !result { + t.Fail() + } +} diff --git a/scraper_test.go b/scraper_test.go index 20f27c1..63c408b 100644 --- a/scraper_test.go +++ b/scraper_test.go @@ -15,7 +15,7 @@ func TestSearchElem(t *testing.T) { html.Parse(strings.NewReader(htmlStr)), ) - ch := searchElem(doc, "span") + ch := SearchElem(doc, "span") count := 0 for range ch { count++ @@ -31,7 +31,7 @@ func TestSearchAttr(t *testing.T) { html.Parse(strings.NewReader(htmlStr)), ) - ch := searchAttr(doc, "id", "test") + ch := SearchAttr(doc, "id", "test") count := 0 for range ch { count++ @@ -47,7 +47,7 @@ func TestSearchElemAttr(t *testing.T) { html.Parse(strings.NewReader(htmlStr)), ) - ch := searchElemAttr(doc, "span", "id", "test") + ch := SearchElemAttr(doc, "span", "id", "test") count := 0 for range ch { count++