Golang HTML 토크나이저

5793 단어 htmltokenizerparsergo


새로운 dom 문서를 생성하여 PHP 또는 Js에서 간단히 수행할 수 있는 것처럼 golang에서 HTML 콘텐츠를 구문 분석하고 추출합니다. golang에는 요구 사항에 따라 다양한 패키지를 사용하여 여러 가지 방법이 있습니다. 내가 알아낸 몇 가지 방법은 다음과 같습니다.
  • gohtml : gohtml은 HTML5 토크나이저 및 파서 구현입니다. 파싱 ​​후 노드를 리턴하고 토크나이저 개념을 사용하여 태그 유형, 태그 이름, 속성 및 텍스트 데이터와 같은 다양한 속성으로 요소를 추출할 수 있습니다.
  • goquery : goquery는 gohtml 패키지 및 CSS 선택기 라이브러리Cascadia에 구축되어 콘텐츠 선택 및 추출에 대해 더 강력한 기능을 제공합니다. jquery와 유사한 문법을 ​​가지고 있습니다.
  • godom : godom은 javascript와 유사하게 Golang에서 DOM을 조작할 수 있게 해주는 라이브러리입니다. GopherJS 을 사용하여 Go 코드를 JavaScript로 컴파일합니다.

  • 지금은 데모 목적으로 gohtml을 사용하여 토큰화를 사용하겠습니다.

    Tokenization is the lexical analysis, parsing the input into tokens. Among HTML tokens are start tags, end tags, attribute names and attribute values.



    문서를 토큰화하는 것은 문서를 DOM과 유사한 요소 및 텍스트 노드의 트리로 구문 분석하는 첫 번째 단계입니다.

    지원되는 HTML 토큰 유형:


  • html.StartTagToken :
  • html.EndTagToken : an end tag such as
  • html.SelfClosingTagToken : a self-closing tag such as <img .../>
  • html.TextToken : text content within a tag
  • html.CommentToken : an HTML comment such as <!-- comment -->
  • html.DoctypeToken : a document type declaration such as <!DOCTYPE html>
  • 예시:

    와 같은 시작 태그


    package main
    import (
     "fmt"
     "strings"
     "io"
     "golang.org/x/net/html"
    )
    func main() {
     tokenizer := html.NewTokenizer(strings.NewReader(sampleHtml))
     for {
      tokenType := tokenizer.Next()
      token := tokenizer.Token()
      if tokenType == html.ErrorToken {
       if tokenizer.Err() == io.EOF {
        return
       }
       fmt.Printf("Error: %v", tokenizer.Err())
       return
      }
      fmt.Printf("Token: %v\n", html.UnescapeString(token.String()))
     }
    }
    const sampleHtml = `<!DOCTYPE html><html><head><style> body {background-color: powderblue;} h1 {color: red;} p {color: orange;}</style><title>Sample HTML Code</title><script src="my-script.js">abc</script></head><body><h1>Main title</h1><p id="demo"></p><a href="https://dev.to/">Dev Community</a><script>document.getElementById("demo").innerHTML = "Hello JavaScript!";</script></body></html>`
    
    


    산출:




    Token: <!DOCTYPE html>
    Token: <html>
    Token: <head>
    Token: <style>
    Token:  body {background-color: powderblue;} h1 {color: red;} p {color: orange;}
    Token: </style>
    Token: <title>
    Token: Sample HTML Code
    Token: </title>
    Token: <script src="my-script.js">
    Token: abc
    Token: </script>
    Token: </head>
    Token: <body>
    Token: <h1>
    Token: Main title
    Token: </h1>
    Token: <p id="demo">
    Token: </p>
    Token: <a href="https://dev.to/">
    Token: Dev Community
    Token: </a>
    Token: <script>
    Token: document.getElementById("demo").innerHTML = "Hello JavaScript!";
    Token: </script>
    Token: </body>
    Token: </html>
    


    여기에서는 단순히 Error Token 또는 EOF를 확인하고 모든 토큰 유형을 그대로 인쇄했습니다.

    위에서 언급한 html.StartTagToken , html.EndTagToken 등과 같은 토큰을 기반으로 HTML을 구문 분석할 수도 있습니다.

    또한 html, h1, script, style 등과 같은 요소 유형에 대해

    tokenizer := html.NewTokenizer(strings.NewReader(sampleHtml))
     for {
      tokenType := tokenizer.Next()
      token := tokenizer.Token()
      if tokenType == html.ErrorToken {
       if tokenizer.Err() == io.EOF {
        return
       }
       fmt.Printf("Error: %v", tokenizer.Err())
       return
      }
      switch token.Data {
      case "script":
       fmt.Printf("Script Token: %v\n", html.UnescapeString(token.String()))
      case "style":
       fmt.Printf("Style Token: %v\n", html.UnescapeString(token.String()))
      default: //This will also include contents of <script>, <style> tags content
       fmt.Printf("Others: %v\n", html.UnescapeString(token.String()))
      }
     }
    


    참조


  • https://pkg.go.dev/golang.org/x/net/html
  • https://drstearns.github.io/tutorials/tokenizing/
  • 좋은 웹페이지 즐겨찾기