Go의 Beautiful Soup 대안
HTML에서 데이터를 추출하는 주제에 이어서
Page content
- Go에서 Beautiful Soup와 직접적으로 유사한 라이브러리를 찾으시려면 soup을 사용하세요.
- CSS 선택자(CSS selector) 지원이 필요하신 경우, goquery를 검토해 보세요.
- XPath 쿼리를 사용하려면 htmlquery를 사용하세요.
- Beautiful Soup에서 영감을 받은 또 다른 옵션으로 Node를 살펴보세요.
Go에서의 Beautiful Soup 대안을 찾고 계신다면, 여러 라이브러리가 유사한 HTML 파싱 및 스크래핑 기능을 제공합니다:

soup
- soup는 Python의 Beautiful Soup을 직접적인 대안(유사물)으로 설계된 Go 라이브러리입니다. API가 의도적으로 유사하게 설계되어
Find,FindAll,HTMLParse와 같은 함수를 특징으로 하며, Beautiful Soup에 익숙한 개발자가 Go로 전환하기 쉽게 만들어졌습니다. - Beautiful Soup과 마찬가지로 웹 페이지를 가져오고, HTML을 파싱하며, DOM을 순회하여 데이터를 추출할 수 있습니다.
- 사용 예시:
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 파싱 라이브러리로, DOM 순회와 조작을 위한 jQuery 유사 구문을 제공합니다.
- 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는 XPath 표현식을 사용하여 HTML 문서에서 데이터를 파싱하고 추출하기 위해 설계된 Go 라이브러리입니다. HTML 트리 구조를 순회하고 쿼리하는 직관적인 API를 제공하여 웹 스크래핑 및 데이터 추출 작업에 특히 유용합니다.
주요 기능
- XPath 1.0/2.0 표현식을 사용하여 HTML 문서를 쿼리할 수 있습니다.
- 문자열, 파일, URL에서 HTML을 로드하는 것을 지원합니다.
- 단일 또는 다중 노드를 찾고, 속성을 추출하며, XPath 표현식을 평가하는 함수를 제공합니다.
- XPath 표현식의 반복 컴파일을 피하여 성능을 향상시키기 위한 쿼시 캐싱(LRU 기반)을 포함합니다.
- Go의 표준 HTML 파싱 라이브러리 위에 구축되어 있으며, goquery 등 다른 Go 라이브러리와 호환됩니다.
기본 사용 예시
문자열에서 HTML 로드:
doc, err := htmlquery.Parse(strings.NewReader("..."))
URL에서 HTML 로드:
doc, err := htmlquery.LoadURL("http://example.com/")
모든 a 요소 찾기:
list := htmlquery.Find(doc, "//a")
href 속성이 있는 모든 a 요소 찾기:
list := htmlquery.Find(doc, "//a[@href]")
첫 번째 h1 요소의 텍스트 추출:
h1 := htmlquery.FindOne(doc, "//h1")
fmt.Println(htmlquery.InnerText(h1)) // 안에 있는 텍스트 출력
a 요소의 href 속성 값 모두 추출:
list := htmlquery.Find(doc, "//a/@href")
for _, n := range list {
fmt.Println(htmlquery.SelectAttr(n, "href"))
}
일반적인 사용 사례
- CSS 선택자보다 더 정확하거나 복잡한 쿼리가 필요한 XPath 기반 웹 스크래핑.
- HTML 문서에서 구조화된 데이터 추출.
- HTML 트리의 프로그래밍 방식 순회 및 조작.
설치
go get github.com/antchfx/htmlquery
Node
- Node는 Beautiful Soup에서 영감을 받은 Go 패키지로, HTML 및 XML 문서에서 데이터를 추출하기 위한 API를 제공합니다.
Colly
Colly - goquery를 내부적으로 HTML 파싱에 사용하는 Go 웹 스크래핑 프레임워크입니다.
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와 유사 |
요약
- Go에서 Beautiful Soup와 직접적으로 유사한 라이브러리를 찾으시려면 soup을 사용하세요.
- CSS 선택자 지원이 필요하신 경우, goquery를 검토해 보세요.
- XPath 쿼리를 사용하려면 htmlquery를 사용하세요.
- Beautiful Soup에서 영감을 받은 또 다른 옵션으로 Node를 살펴보세요.
이 모든 라이브러리는 견고하고 HTML5에 준수하는 Go의 표준 HTML 파서를 활용하므로, 주요 차이는 API 스타일과 선택자 기능에서 나타납니다.