[go] 웹 페이지 구문 분석

Go 언어를 사용하여 웹 페이지를 구문 분석하고 데이터를 추출하는 방법을 알아보겠습니다.

1. 웹 페이지 다운로드

우선 원하는 웹 페이지를 다운로드해야 합니다. 이를 위해서는 net/http 패키지를 사용하여 HTTP GET 요청을 보내고, 응답을 받아야 합니다.

package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
)

func main() {
	url := "http://example.com"
	resp, err := http.Get(url)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		panic(err)
	}
	fmt.Println(string(body))
}

2. HTML 구문 분석

이제 다운로드한 웹 페이지의 HTML을 파싱하여 원하는 데이터를 추출할 수 있습니다. Go 언어에서는 golang.org/x/net/html 패키지를 사용하여 HTML을 구문 분석할 수 있습니다.

package main

import (
	"fmt"
	"golang.org/x/net/html"
	"net/http"
)

func main() {
	url := "http://example.com"
	resp, err := http.Get(url)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()
	doc, err := html.Parse(resp.Body)
	if err != nil {
		panic(err)
	}

	// 필요한 데이터 추출
	// ...
}

3. 데이터 추출

HTML을 파싱한 후에는 필요한 데이터를 추출할 수 있습니다. golang.org/x/net/html 패키지의 함수들을 사용하여 원하는 요소나 속성을 찾아내고 값을 추출할 수 있습니다.

func extractText(n *html.Node) string {
	var text string
	if n.Type == html.TextNode {
		text = n.Data
	}
	for c := n.FirstChild; c != nil; c = c.NextSibling {
		text += extractText(c)
	}
	return text
}

func main() {
	// 이전 코드 생략

	// 필요한 데이터 추출
	var data string
	var f func(*html.Node)
	f = func(n *html.Node) {
		if n.Type == html.ElementNode && n.Data == "title" {
			data = extractText(n)
		}
		for c := n.FirstChild; c != nil; c = c.NextSibling {
			f(c)
		}
	}
	f(doc)
	fmt.Println(data)
}

위 코드에서는 타이틀 요소의 텍스트를 추출하는 예제입니다.

이제 Go 언어를 사용하여 웹 페이지를 다운로드하고 HTML을 파싱하며 데이터를 추출하는 방법에 대해 알아보았습니다. 고급 기술을 추가하여 원하는 데이터를 구문 분석하는 방법을 익히고 나만의 웹 스크래퍼를 개발해보세요.

참고문헌: golang.org/x/net/html