Go용 Beautiful Soup 대안
HTML에서 데이터를 추출하는 주제를 이어가며
Page content
- Go에서 Beautiful Soup과 직접적으로 대응하는 라이브러리를 사용하려면 soup을 사용하세요.
- CSS 선택자 지원이 필요하다면 goquery를 고려하세요.
- XPath 쿼리를 사용하려면 htmlquery를 사용하세요.
- 또 다른 Beautiful Soup 영감을 받은 옵션을 원한다면 Node를 참고하세요.
Go에서 Beautiful Soup 대응 라이브러리를 찾고 있다면, 여러 라이브러리가 유사한 HTML 파싱 및 스크래핑 기능을 제공합니다:
soup
- soup은 Python의 Beautiful Soup과 직접적으로 대응하도록 설계된 Go 라이브러리입니다. 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는 DOM 탐색 및 조작을 위해 jQuery와 유사한 문법을 제공하는 또 다른 인기 있는 Go HTML 파싱 라이브러리입니다.
- 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/")
모든 `` 요소 찾기:
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"))
}
일반적인 사용 사례
- CSS 선택자보다 XPath로 더 정확하거나 복잡한 쿼리가 필요한 웹 스크래핑.
- HTML 문서에서 구조화된 데이터 추출.
- HTML 트리를 프로그래밍적으로 탐색 및 조작.
설치
go get github.com/antchfx/htmlquery
Node
- Node는 Beautiful Soup을 영감으로 받아, HTML 및 XML 문서에서 데이터를 추출하는 데 사용되는 Go 패키지입니다.
Colly
Colly - Go를 위한 웹 스크래핑 프레임워크로, 내부적으로 goquery를 사용하여 HTML을 파싱합니다.
https://github.com/gocolly/colly
설치 방법 - go.mod 파일에 colly를 추가하세요:
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를 참고하세요.
이 모든 라이브러리는 Go의 표준 HTML 파서를 활용하며, 이는 견고하고 HTML5에 호환됩니다. 따라서 주요 차이점은 API 스타일과 선택자 기능에 있습니다.