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

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

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

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

гопфер готовит суп

soup

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

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)) // Выводит текст внутри

Извлечение всех значений атрибута 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("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, который надежен и соответствует стандарту HTML5, поэтому основное различие заключается в стиле API и возможностях селекторов.

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