Альтернативы 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 намеренно похож, с функциями вроде
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 и возможностях селекторов.