goqueryはGBKサポートを追加

2292 ワード

1、説明


golangのデフォルト符号化はutf-8であり、goqueryも同様に、デフォルト処理のutf-8のページである.しかし、ウェブページには一般的な「gb 2312」、「gbk」などのフォーマットがあります.これらの符号化されたウェブページを処理する際にヘッドの大きい文字化けが発生する.golangには独自のコーデックパケットがなく,サードパーティパケットによる処理が必要である.

2、simplifiedchinese処理GBKコード##


サードパーティのエンコーディングパッケージはたくさんありますが、ここではsimplifiedchineseを使用しています.simplifiedchineseは他のものと比較してgccのサポートを必要としないからです.
package util

import (
	"golang.org/x/text/encoding/simplifiedchinese"
)

func DecodeToGBK(text string) (string, error) {

	dst := make([]byte, len(text)*2)
	tr := simplifiedchinese.GB18030.NewDecoder()
	nDst, _, err := tr.Transform(dst, []byte(text), true)
	if err != nil {
		return text, err
	}

	return string(dst[:nDst]), nil
}


3、goquery簡単変換GBK


次はgoqueryを使うときに、異常な文字をコードする文字を回してみましょう.次のようになります.
doc, _ := goquery.NewDocument(url)

nameNode := doc.Find("div.name").First()
name, _ := nameNode.Html()
name, _ = util.DecodeToGBK(name)

ageNode := doc.Find("div.age").First()
age, _ := ageNode.Html()
age, _ = util.DecodeToGBK(age)
 

4、goqueryの書き換え方法はGBKをサポートする


上記の符号化変換のプロセスのように、複数のノードが符号化変換を必要とする場合、私たちのビジネスコードは肥大化しており、優雅ではありません.我々はgoquery Selectionオブジェクトの従来の方法において,GBKサポートの方法をいくつか追加することができる.
従来のHtml()メソッド
// Html gets the HTML contents of the first element in the set of matched
// elements. It includes text and comment nodes.
func (s *Selection) Html() (ret string, e error) {
	// Since there is no .innerHtml, the HTML content must be re-created from
	// the nodes using html.Render.
	var buf bytes.Buffer

	if len(s.Nodes) > 0 {
		for c := s.Nodes[0].FirstChild; c != nil; c = c.NextSibling {
			e = html.Render(&buf, c)
			if e != nil {
				return
			}
		}
		ret = buf.String()
	}

	return
}


GBKサポートのGBKHtml()メソッドを追加します.
func (s *Selection) GBKHtml() (ret string, e error) {
	// Since there is no .innerHtml, the HTML content must be re-created from
	// the nodes using html.Render.
	ret, _ = s.Html()
	ret, _ = util.DecodeToGBK(ret)
	return
}

優雅に使用:
doc, _ := goquery.NewDocument(url)

name, _ := doc.Find("div.name").First().GBKHtml()
age, _ := doc.Find("div.age").First().GBKHtml()