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

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

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

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

гopher готовит суп

soup

  • soup — это библиотека на Go, явно спроектированная как аналог Beautiful Soup для Python. Её API намеренно схож, включая такие функции, как Find, FindAll и HTMLParse, что облегчает переход разработчикам, знакомым с Beautiful Soup, на Go.
  • Она позволяет загружать веб-страницы, парсить 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 :", 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(), "| Link :", 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/")

Поиск всех элементов ``:

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

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

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

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

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

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

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()

	// Find and visit all links
	c.OnHTML("a[href]", func(e *colly.HTMLElement) {
		e.Request.Visit(e.Attr("href"))
	})

	c.OnRequest(func(r *colly.Request) {
		fmt.Println("Visiting", 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, который является robust и соответствует спецификации HTML5, поэтому основное различие заключается в стиле API и возможностях селекторов.

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

Подписаться

Получайте новые материалы про системы, инфраструктуру и AI engineering.