Альтернативы 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 и возможностях селекторов.
Полезные ссылки
- Генерация PDF на Python - библиотеки и примеры
- Сheat Sheet по Golang
- Производительность AWS Lambda: JavaScript vs Python vs Golang
- Исправление ошибки Golang GORM AutoMigrate для PostgreSQL
- Популярность языков программирования и фреймворков
- Cheat Sheet по Bash
- Генерация PDF на GO - библиотеки и примеры