Go의 Beautiful Soup 대안

HTML에서 데이터를 추출하는 주제에 이어서

Page content
  • Go에서 Beautiful Soup와 직접적으로 유사한 라이브러리를 찾으시려면 soup을 사용하세요.
  • CSS 선택자(CSS selector) 지원이 필요하신 경우, goquery를 검토해 보세요.
  • XPath 쿼리를 사용하려면 htmlquery를 사용하세요.
  • Beautiful Soup에서 영감을 받은 또 다른 옵션으로 Node를 살펴보세요.

Go에서의 Beautiful Soup 대안을 찾고 계신다면, 여러 라이브러리가 유사한 HTML 파싱 및 스크래핑 기능을 제공합니다:

gopher가 수프를 요리하는 모습

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 스타일과 선택자 기능에서 나타납니다.

유용한 링크

구독하기

시스템, 인프라, AI 엔지니어링에 관한 새 글을 받아보세요.