Go:
Разбор HTML

Как:

Для разбора HTML в Go обычно используется пакет goquery или стандартный пакет net/html. Вот базовый пример использования net/html для извлечения всех ссылок с веб-страницы:

package main

import (
    "fmt"
    "golang.org/x/net/html"
    "net/http"
)

func main() {
    // Получить HTML-документ
    res, err := http.Get("http://example.com")
    if err != nil {
        panic(err)
    }
    defer res.Body.Close()

    // Разобрать HTML-документ
    doc, err := html.Parse(res.Body)
    if err != nil {
        panic(err)
    }

    // Функция для рекурсивного обхода DOM
    var f func(*html.Node)
    f = func(n *html.Node) {
        if n.Type == html.ElementNode && n.Data == "a" {
            for _, a := range n.Attr {
                if a.Key == "href" {
                    fmt.Println(a.Val)
                    break
                }
            }
        }
        for c := n.FirstChild; c != nil; c = c.NextSibling {
            f(c)
        }
    }

    // Обход DOM
    f(doc)
}

Пример вывода (предполагая, что http://example.com содержит две ссылки):

http://www.iana.org/domains/example
http://www.iana.org/domains/reserved

Этот код запрашивает HTML-страницу, разбирает ее и рекурсивно обходит DOM, чтобы найти и вывести атрибуты href всех тегов <a>.

Подробнее

Пакет net/html предоставляет основу для разбора HTML в Go, непосредственно реализуя алгоритмы токенизации и построения дерева, указанные в стандарте HTML5. Этот низкоуровневый подход мощный, но может быть громоздким для сложных задач.

В отличие от этого, сторонний пакет goquery, вдохновленный jQuery, предлагает интерфейс более высокого уровня, который упрощает манипуляцию и обход DOM. Он позволяет разработчикам писать краткий и выразительный код для задач, таких как выбор элементов, извлечение атрибутов и манипуляция содержимым.

Однако удобство goquery идет за счет дополнительной зависимости и потенциально более медленной производительности из-за его абстрактного слоя. Выбор между net/html и goquery (или другими библиотеками для разбора) зависит от конкретных требований проекта, таких как необходимость оптимизации производительности или удобства использования.

Исторически разбор HTML в Go развивался от простых операций со строками до сложной манипуляции с деревом DOM, отражая растущий экосистему языка и спрос сообщества на мощные инструменты для веб-скрепинга и извлечения данных. Несмотря на встроенные возможности, распространенность сторонних библиотек, таких как goquery, подчеркивает предпочтение сообщества Go к модульному, переиспользуемому коду. Однако для приложений, критичных к производительности, программисты могут по-прежнему отдавать предпочтение пакету net/html или даже прибегать к regex для простых задач разбора, учитывая врожденные риски и ограничения разбора HTML с помощью regex.