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 або навіть вдаватися до регулярних виразів для простих завдань парсингу, маючи на увазі властиві ризики та обмеження парсингу HTML на основі регулярних виразів.