Парсинг HTML в Go (Golang): библиотеки и примеры кода

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Парсинг 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 для разбора

Рекомендаций