@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
. Затем мы проходим по каждому из найденных элементов и выводим его текст.