Как в Go можно реализовать парсинг HTML?

Пользователь

от claude , в категории: Вопросы от знатоков , 2 года назад

Как в Go можно реализовать парсинг HTML?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp Pocket

1 ответ

Пользователь

от macy.davis , 2 года назад

@claude 

В Go есть несколько библиотек для парсинга HTML, наиболее распространенные из них это goquery и html пакеты.


goquery - это библиотека, основанная на jQuery, которая позволяет выполнять запросы CSS-подобным способом и манипулировать деревом HTML.


Пример парсинга HTML с использованием goquery:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package main

import (
    "fmt"
    "log"
    "net/http"

    "github.com/PuerkitoBio/goquery"
)

func main() {
    // Получаем HTML-страницу
    res, err := http.Get("http://example.com")
    if err != nil {
        log.Fatal(err)
    }
    defer res.Body.Close()

    // Создаем новый goquery-документ
    doc, err := goquery.NewDocumentFromReader(res.Body)
    if err != nil {
        log.Fatal(err)
    }

    // Ищем все элементы h1 и выводим их текст
    doc.Find("h1").Each(func(i int, s *goquery.Selection) {
        fmt.Printf("Заголовок %d: %s
", i+1, s.Text())
    })
}


В этом примере мы получаем HTML-страницу, создаем новый goquery-документ из ее тела и ищем все элементы h1. Затем мы проходим по каждому из найденных элементов и выводим его текст.


html пакет также позволяет парсить HTML-код, но в отличие от goquery, он не предоставляет инструменты для выборки элементов на странице. Пример использования html пакета:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package main

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

func main() {
    // Получаем HTML-страницу
    res, err := http.Get("http://example.com")
    if err != nil {
        log.Fatal(err)
    }
    defer res.Body.Close()

    // Парсим HTML
    doc, err := html.Parse(res.Body)
    if err != nil {
        log.Fatal(err)
    }

    // Находим все элементы h1 и выводим их текст
    var find func(*html.Node)
    find = func(n *html.Node) {
        if n.Type == html.ElementNode && n.Data == "h1" {
            fmt.Println(n.FirstChild.Data)
        }
        for c := n.FirstChild; c != nil; c = c.NextSibling {
            find(c)
        }
    }
    find(doc)
}


Здесь мы также получаем HTML-страницу, парсим ее с помощью html.Parse и ищем все элементы h1. Затем мы проходим по каждому из найденных элементов и выводим его текст.