Поиск по сайту:

Как парсить и генерировать HTML в Go


Анализ и генерация HTML не составляет труда с помощью пакетов Golang html и html/template.

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

Go предоставляет пакеты для работы с документами, включая форматы HTML и XML, широко используемые на веб-страницах. Пакет html предоставляет функции для токенизации и анализа HTML.

HTML-пакет

Пакет html предоставляет HTML5-совместимый токенизатор и анализатор для анализа и управления HTML-документами, обхода дерева синтаксического анализа и управления древовидной структурой. Пакет html — это встроенный пакет стандартной библиотеки Go.

Одной из основных особенностей пакета html является функция Parse, которая может анализировать HTML-документы и возвращать корневой узел дерева разбора, откуда вы можете использовать такие функции, как FirstChild и NextSibling для навигации по дереву и извлечения информации из документа. Пакет также предоставляет функцию ParseFragment для анализа фрагментов HTML-документов.

Функция EscapeString удобна для экранирования специальных символов в строках для более безопасного включения в HTML; вы можете использовать эту функцию для предотвращения атак межсайтового скриптинга (XSS) путем преобразования специальных символов в соответствующие им объекты HTML.

Чтобы начать работу с пакетом html, вы можете импортировать его в файлы проекта Go.

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

Пакет html не предоставляет никаких функций для создания HTML. Вместо этого вы можете использовать пакет html/template, который предлагает набор функций для создания HTML-шаблонов. Пакет html/template предоставляет функцию template.HTMLEscape для записи экранированных версий HTML в средство записи ответов.

Пакет html/template также является частью стандартной библиотеки, и вот как его можно импортировать.

import "html/template"

Пакет html — наиболее популярный пакет шаблонов в экосистеме Go, поддерживающий различные операции и типы данных.

Парсинг HTML в Go

Функция Parse пакета html помогает анализировать текст и документы HTML. Функция Parse принимает экземпляр io.Reader в качестве первого аргумента, содержащего файловый документ, и экземпляр *html.Node, который корневой узел HTML-документа

Вот как вы можете использовать функцию Parse для анализа веб-страницы и возврата всех URL-адресов на ней.

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)
    }
}

Функция main отправляет HTTP-запрос GET на веб-сайт с помощью функции Get пакета http и получает тело ответа страницы. Функция Parse пакета html анализирует тело ответа и возвращает HTML-документ.

Переменная links – это фрагмент строк, в котором будут храниться URL-адреса веб-страницы. Функция link принимает ссылку на указатель на метод Node для пакета html и метод Key пакета экземпляр атрибута из узла возвращает данные, содержащиеся в указанном атрибуте (в данном случае href). Функция проходит по документу с помощью метода NextSibling из узла FirstChild, чтобы распечатать каждый URL-адрес на веб-странице. Наконец, цикл for печатает все URL-адреса из фрагмента links.

Вот результат операции.

Генерация HTML в Go

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

Вы можете создать HTML для рендеринга на стороне сервера с помощью пакета html/template. Генерация HTML удобна во многих случаях использования, таких как отправка электронных писем, отрисовка интерфейса на стороне сервера и многое другое. Вы можете использовать встроенные типы данных Go, такие как карты и структуры, для взаимодействия и управления HTML-кодом вашей веб-страницы.

Вам необходимо понимать синтаксис шаблонов Go HTML, чтобы успешно генерировать HTML с помощью пакета html/template.

import (
    "html/template"
    "os"
)
type webPage struct {
    Title string
    Heading string
    Text string
}
func main() {
    // Define the template
    tmpl := `
<!DOCTYPE html>
<html>
<head>
    <title>{{.Title}}</title>
</head>
<body>
    <h1>{{.Heading}}</h1>
    <p>{{.Text}}</p>
</body>
</html>`
    // Define the data to be used in the template
    web := webPage{
        Title: "An Example Page",
        Heading: "Welcome to my website!",
        Text: "This is the home page of my website.",
    }
    // Create a new template and parse the template string
    t, err := template.New("webpage").Parse(tmpl)
    if err != nil {
        panic(err)
    }
    // Execute the template and write the result to stdout
    err = t.Execute(os.Stdout, web )
    if err != nil {
        panic(err)
    }
}

Переменная tmpl содержит строку HTML. Строка HTML использует синтаксис шаблонов Go для определения заголовка страницы, заголовка h1 и абзаца текста. Структура webPage определяет поля данных для веб-страницы с полями Заголовок, Заголовок и Текст.

Метод Parse функции New пакета шаблона создает и анализирует новый шаблон со строкой шаблона. Функция Execute нового экземпляра шаблона выполняет шаблон с данными из вашего экземпляра структуры и возвращает результат на стандартный вывод (в этом случае она выводит результат на консоль).

Создавайте веб-приложения с помощью Go

Изучение синтаксического анализа и генерации HTML с помощью Go — это один шаг в правильном направлении к созданию более сложных веб-приложений с помощью Go. Вы можете использовать такие платформы, как Gin и Echo, а также маршрутизаторы, такие как Gorilla Mux и Chi Router, для создания серверной части вашего веб-приложения.

Эти пакеты созданы на основе пакета net/http (встроенный пакет для взаимодействия с HTTP в Go) и абстрагируют сложности настройки серверов и маршрутизаторов в Go.

Статьи по данной тематике: