Код IT Загрузка примера кода…

Go main.go
package parse

import (
	"fmt"
	"strings"

	"golang.org/x/net/html"
)

// ExtractByTag извлекает текстовое содержимое всех элементов с указанным тегом.
// Например, tag="h2" вернёт все заголовки второго уровня.
func ExtractByTag(htmlContent, tag string) ([]string, error) {
	tag = strings.ToLower(strings.TrimSpace(tag))
	if tag == "" {
		return nil, fmt.Errorf("тег не может быть пустым")
	}

	doc, err := html.Parse(strings.NewReader(htmlContent))
	if err != nil {
		return nil, fmt.Errorf("разбор HTML: %w", err)
	}

	var results []string
	var walk func(*html.Node)

	walk = func(n *html.Node) {
		if n.Type == html.ElementNode && n.Data == tag {
			text := strings.TrimSpace(collectText(n))
			if text != "" {
				results = append(results, text)
			}
		}
		for child := n.FirstChild; child != nil; child = child.NextSibling {
			walk(child)
		}
	}

	walk(doc)
	return results, nil
}

// collectText собирает весь текст внутри узла (включая вложенные элементы).
func collectText(n *html.Node) string {
	if n.Type == html.TextNode {
		return n.Data
	}

	var b strings.Builder
	for child := n.FirstChild; child != nil; child = child.NextSibling {
		b.WriteString(collectText(child))
	}
	return b.String()
}
package parse

import (
	"fmt"
	"strings"

	"golang.org/x/net/html"
)

// ExtractByTag извлекает текстовое содержимое всех элементов с указанным тегом.
// Например, tag="h2" вернёт все заголовки второго уровня.
func ExtractByTag(htmlContent, tag string) ([]string, error) {
	tag = strings.ToLower(strings.TrimSpace(tag))
	if tag == "" {
		return nil, fmt.Errorf("тег не может быть пустым")
	}

	doc, err := html.Parse(strings.NewReader(htmlContent))
	if err != nil {
		return nil, fmt.Errorf("разбор HTML: %w", err)
	}

	var results []string
	var walk func(*html.Node)

	walk = func(n *html.Node) {
		if n.Type == html.ElementNode && n.Data == tag {
			text := strings.TrimSpace(collectText(n))
			if text != "" {
				results = append(results, text)
			}
		}
		for child := n.FirstChild; child != nil; child = child.NextSibling {
			walk(child)
		}
	}

	walk(doc)
	return results, nil
}

// collectText собирает весь текст внутри узла (включая вложенные элементы).
func collectText(n *html.Node) string {
	if n.Type == html.TextNode {
		return n.Data
	}

	var b strings.Builder
	for child := n.FirstChild; child != nil; child = child.NextSibling {
		b.WriteString(collectText(child))
	}
	return b.String()
}