Парсинг HTML в Go (Golang): обзор инструментов и примеры
Go (Golang) — это компилируемый, статически типизированный язык программирования от Google, который идеально подходит для создания высокопроизводительных парсеров и веб-скраперов. Благодаря встроенной поддержке конкурентности (горутины) и богатой стандартной библиотеке, Go позволяет эффективно обрабатывать HTML-документы любой сложности. В этой статье мы рассмотрим основные библиотеки для парсинга HTML на Go, их возможности и приведём практические примеры кода.
Стандартная библиотека: net/html
Пакет golang.org/x/net/html — это основа для работы с HTML в Go. Он предоставляет токенизатор и парсер, который строит DOM-дерево документа. Это низкоуровневый инструмент, дающий полный контроль над процессом разбора, но требующий больше кода для типовых задач.
Пример использования net/html для извлечения всех ссылок из HTML-документа:
package main
import (
"fmt"
"golang.org/x/net/html"
"strings"
)
func main() {
htmlContent := `<html><body><a href="/page1">Ссылка 1</a><a href="/page2">Ссылка 2</a></body></html>`
doc, _ := html.Parse(strings.NewReader(htmlContent))
var links []string
var f func(*html.Node)
f = func(n *html.Node) {
if n.Type == html.ElementNode && n.Data == "a" {
for _, attr := range n.Attr {
if attr.Key == "href" {
links = append(links, attr.Val)
}
}
}
for c := n.FirstChild; c != nil; c = c.NextSibling {
f(c)
}
}
f(doc)
for _, link := range links {
fmt.Println(link)
}
}
Этот код рекурсивно обходит DOM-дерево, находит все теги <a> и извлекает значение атрибута href. Метод прост и надёжен, но для более сложных задач (например, поиск по CSS-селекторам) лучше использовать специализированные библиотеки.
Библиотека goquery: jQuery для Go
github.com/PuerkitoBio/goquery — самая популярная библиотека для парсинга HTML в Go. Она предоставляет API, напоминающий jQuery: выборка элементов по CSS-селекторам, цепочки методов, манипуляции с DOM. Это делает код лаконичным и читаемым.
Установка:
go get github.com/PuerkitoBio/goquery
Пример парсинга страницы с извлечением заголовков и ссылок:
package main
import (
"fmt"
"log"
"net/http"
"github.com/PuerkitoBio/goquery"
)
func main() {
// Загружаем HTML-страницу
res, err := http.Get("https://example.com")
if err != nil {
log.Fatal(err)
}
defer res.Body.Close()
// Парсим HTML
doc, err := goquery.NewDocumentFromReader(res.Body)
if err != nil {
log.Fatal(err)
}
// Извлекаем заголовки h2
doc.Find("h2").Each(func(i int, s *goquery.Selection) {
fmt.Printf("Заголовок %d: %s\n", i+1, s.Text())
})
// Извлекаем все ссылки
doc.Find("a").Each(func(i int, s *goquery.Selection) {
link, _ := s.Attr("href")
text := s.Text()
fmt.Printf("Ссылка %d: %s (%s)\n", i+1, text, link)
})
}
Ключевые возможности goquery:
- CSS-селекторы: поддержка всех стандартных селекторов (классы, ID, атрибуты, псевдоклассы).
- Цепочки методов:
Find().Filter().Each()— код пишется как в jQuery. - Извлечение данных: методы
Text(),Html(),Attr(). - Модификация DOM:
SetText(),SetHtml(),Append().
Для работы с большими объёмами данных goquery использует буферизацию и оптимизирован для скорости.
Библиотека colly: фреймворк для веб-скрапинга
github.com/gocolly/colly/v2 — это мощный фреймворк для веб-скрапинга, включающий в себя парсинг HTML, управление запросами, кэширование и поддержку конкурентности. Внутри он использует goquery для разбора
Также в библиотеке
Тестирование в Go (Golang): фреймворки и инструменты — полное руководство
Работа с XML в C++: библиотеки pugixml, TinyXML-2 и RapidXML
ORM для Java: сравнение Hibernate, MyBatis, JPA и Spring Data
Работа с Kafka в Go (Golang): библиотека segmentio/kafka-go