Альтернативы Beautiful Soup для Go

Продолжаем тему извлечения данных из HTML

Содержимое страницы
  • Для прямого аналога Beautiful Soup на Go используйте soup.
  • Для поддержки CSS-селекторов рассмотрите goquery.
  • Для запросов XPath используйте htmlquery.
  • Для другого варианта, вдохновлённого Beautiful Soup, обратите внимание на Node.

Если вы ищете эквивалент Beautiful Soup на Go, несколько библиотек предлагают аналогичную функциональность для разбора и парсинга HTML:

gopher готовит суп

soup

  • soup — это библиотека Go, специально разработанная как аналог Python Beautiful Soup. Её API намеренно похож, с функциями вроде Find, FindAll и HTMLParse, что облегчает переход разработчикам, знакомым с Beautiful Soup.
  • Она позволяет получать веб-страницы, разбирать HTML и проходить по DOM для извлечения данных, как и Beautiful Soup.
  • Пример использования:
    resp, err := soup.Get("https://xkcd.com")
    if err != nil {
        os.Exit(1)
    }
    doc := soup.HTMLParse(resp)
    links := doc.Find("div", "id", "comicLinks").FindAll("a")
    for _, link := range links {
        fmt.Println(link.Text(), "| Ссылка:", link.Attrs()["href"])
    }
    
  • Примечание: soup не поддерживает CSS-селекторы или XPath; он полагается на поиск по тегам и атрибутам.

goquery

  • goquery — ещё одна популярная библиотека Go для разбора HTML, предлагающая синтаксис, похожий на jQuery, для навигации и манипуляции DOM.
  • Она поддерживает CSS-селекторы, что делает её более гибкой для сложных запросов по сравнению с soup.
  • Пример использования:
    doc, err := goquery.NewDocumentFromReader(resp.Body)
    doc.Find("div#comicLinks a").Each(func(i int, s *goquery.Selection) {
        fmt.Println(s.Text(), "| Ссылка:", s.AttrOr("href", ""))
    })
    

Библиотека htmlquery для Go

htmlquery — это библиотека Go, предназначенная для разбора и извлечения данных из HTML-документов с использованием выражений XPath. Она предоставляет простой API для навигации и запросов в структуре HTML-дерева, что делает её особенно полезной для веб-скрейпинга и задач извлечения данных.

Основные возможности

  • Позволяет запрашивать HTML-документы с выражениями XPath 1.0/2.0.
  • Поддерживает загрузку HTML из строк, файлов или URL.
  • Предоставляет функции для поиска отдельных или нескольких узлов, извлечения атрибутов и оценки выражений XPath.
  • Включает кэширование запросов (на основе LRU) для повышения производительности за счёт избежания повторного компилирования выражений XPath.
  • Построена на стандартных библиотеках разбора HTML в Go и совместима с другими библиотеками Go, такими как goquery.

Примеры базового использования

Загрузка HTML из строки:

doc, err := htmlquery.Parse(strings.NewReader("..."))

Загрузка HTML из URL:

doc, err := htmlquery.LoadURL("http://example.com/")

Поиск всех элементов <a>:

list := htmlquery.Find(doc, "//a")

Поиск всех элементов <a> с атрибутом href:

list := htmlquery.Find(doc, "//a[@href]")

Извлечение текста первого элемента <h1>:

h1 := htmlquery.FindOne(doc, "//h1")
fmt.Println(htmlquery.InnerText(h1)) // Выводит текст внутри <h1>

Извлечение всех значений атрибута href из элементов <a>:

list := htmlquery.Find(doc, "//a/@href")
for _, n := range list {
    fmt.Println(htmlquery.SelectAttr(n, "href"))
}

Типичные случаи использования

  • Веб-скрейпинг, где XPath обеспечивает более точное или сложное запросы, чем CSS-селекторы.
  • Извлечение структурированных данных из HTML-документов.
  • Навигация и программное управление деревьями HTML.

Установка

go get github.com/antchfx/htmlquery

Node

  • Node — это пакет Go, вдохновлённый Beautiful Soup, предоставляющий API для извлечения данных из HTML и XML-документов.

Colly

Colly — это фреймворк для веб-скрейпинга на Go, который использует goquery для разбора HTML.

https://github.com/gocolly/colly

Для установки добавьте colly в файл go.mod:

module github.com/x/y

go 1.14

require (
        github.com/gocolly/colly/v2 latest
)

Пример:

func main() {
	c := colly.NewCollector()

	// Найти и посетить все ссылки
	c.OnHTML("a[href]", func(e *colly.HTMLElement) {
		e.Request.Visit(e.Attr("href"))
	})

	c.OnRequest(func(r *colly.Request) {
		fmt.Println("Посещение", r.URL)
	})

	c.Visit("http://go-colly.org/")
}

Сравнительная таблица

Библиотека Стиль API Поддержка селекторов Вдохновление Примечания
soup Похожий на Beautiful Soup Только теги и атрибуты Beautiful Soup Простой, без CSS/XPath
goquery Похожий на jQuery CSS-селекторы jQuery Гибкий, популярный
htmlquery XPath XPath lxml/XPath Сложные запросы
Node Похожий на Beautiful Soup Теги и атрибуты Beautiful Soup Похож на soup

Итог

  • Для прямого аналога Beautiful Soup на Go используйте soup.
  • Для поддержки CSS-селекторов рассмотрите goquery.
  • Для запросов XPath используйте htmlquery.
  • Для другого варианта, вдохновлённого Beautiful Soup, обратите внимание на Node.

Все эти библиотеки используют стандартный парсер HTML в Go, который является надёжным и совместимым с HTML5, поэтому основное различие заключается в стиле API и возможностях селекторов.

Полезные ссылки