Как парсить и генерировать 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.