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.