Гид по технологиям

Парсинг и генерация HTML в Go

7 min read Development Обновлено 07 Jan 2026
Парсинг и генерация HTML в Go
Парсинг и генерация HTML в Go

Маскот Go — синий гофер на фоне столбцов зелёных символов, символизирующих кодовую страницу

Парсинг — это анализ и интерпретация структуры документа. Процесс может включать извлечение конкретных элементов, атрибутов или данных из документа и проверку того, что документ корректно сформирован и соответствует ожиданиям. Парсинг часто используется для извлечения данных из веб‑страниц, рендеринга или для предобработки HTML перед отображением пользователю.

Go предоставляет пакеты для работы с документами в форматах HTML и XML. Для разбора HTML чаще всего используют пакет golang.org/x/net/html (реализует токенизацию и построение дерева узлов), а для безопасной генерации HTML — html/template из стандартной библиотеки.

Важно: пакет golang.org/x/net/html находится в репозитории x/net (поддерживается командой Go), а пакет html/template — в стандартной библиотеке. html/template выполняет автоматическое экранирование, что помогает предотвращать XSS при генерации HTML.

Пакет html (golang.org/x/net/html)

Пакет golang.org/x/net/html предоставляет HTML5‑совместимый токенизатор и парсер, даёт возможность строить дерево узлов документа (DOM‑подобная структура), обходить его и извлекать нужные элементы.

Ключевые функции и типы:

  • html.Parse(io.Reader) — парсит HTML и возвращает корневой *html.Node.
  • html.ParseFragment — парсит фрагмент HTML в контексте узла (полезно для вставки в существующее дерево).
  • html.Tokenizer — низкоуровневый парсер, полезен для потоковой обработки.
  • html.Node — тип узла, описывающий элементы, текст, комментарии и т.д.

Пример использования html.Parse для извлечения всех ссылок со страницы сохранил в исходном виде (ниже). Код демонстрирует обход дерева и сбор значений атрибутов href.

import (  
    "fmt"  
    "golang.org/x/net/html"  
    "net/http"  
)  
  
func main() {  
    // Send an HTTP GET request to the example.com web page  
    resp, err := http.Get("https://www.example.com")  
    if err != nil {  
        fmt.Println("Error:", err)  
        return  
    }  
    defer resp.Body.Close()  
  
    // Use the html package to parse the response body from the request  
    doc, err := html.Parse(resp.Body)  
    if err != nil {  
        fmt.Println("Error:", err)  
        return  
    }  
  
      
    // Find and print all links on the web page  
    var links []string  
    var link func(*html.Node)  
    link = func(n *html.Node) {  
        if n.Type == html.ElementNode && n.Data == "a" {  
            for _, a := range n.Attr {  
                if a.Key == "href" {  
                    // adds a new link entry when the attribute matches  
                    links = append(links, a.Val)  
                }  
            }  
        }  
  
        // traverses the HTML of the webpage from the first child node  
        for c := n.FirstChild; c != nil; c = c.NextSibling {  
            link(c)  
        }  
    }  
    link(doc)  
  
    // loops through the links slice  
    for _, l := range links {  
        fmt.Println("Link:", l)  
    }  
}  

Объяснение алгоритма:

Пояснение терминов:

Результат извлечения ссылок с веб‑страницы — список URL в консоли

Генерация HTML с html/template

Пакет html/template предназначен для безопасной генерации HTML с автоматическим экранированием. Используйте его, когда нужно рендерить страницы на сервере, формировать письма или пра́вильно вставлять динамические значения в HTML.

Ключевая идея: используйте шаблоны для разделения представления и данных — пакет автоматически экранирует значения, чтобы избежать XSS. В случаях, когда нужен «сырый» HTML, используйте template.HTML осознанно и только с доверенными данными.

Пример создания простого шаблона сохранён в исходном виде:

Рекомендации по использованию html/template:

Пример результата генерации HTML — сгенерированная страница, выведенная в консоль

Практические советы и шаблоны использования

Мини‑методология быстрого парсинга (шаги):

  1. Сделать HTTP‑запрос с корректными заголовками (User‑Agent, Accept).
  2. Проверить статус ответа и Content‑Type.
  3. Передать resp.Body в html.Parse или html.Tokenizer.
  4. Обойти дерево/токены и собрать данные в структуры.
  5. Валидация и нормализация данных (URL, даты, числа).
  6. Обработка ошибок и логирование.

Безопасность и конфиденциальность

Когда подход не сработает — ограничения и контрпримеры

Альтернативные подходы:

Ментальные модели и эвристики

Чек‑листы по ролям

Разработчик:

Код‑ревьюер:

Операции/DevOps:

Критерии приёмки

Примеры тестовых случаев (acceptance)