Go용 Beautiful Soup 대안

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

Page content
  • Go에서 Beautiful Soup과 직접적으로 대응하는 라이브러리를 사용하려면 soup을 사용하세요.
  • CSS 선택자 지원이 필요하다면 goquery를 고려하세요.
  • XPath 쿼리를 사용하려면 htmlquery를 사용하세요.
  • 또 다른 Beautiful Soup 영감을 받은 옵션을 원한다면 Node를 참고하세요.

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

gopher is cooking soup

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

유용한 링크