上一篇文章,分享了如何将字符串GBK,UTF8编码互转,确实很实用。
但是我在爬取了一篇GBK编码的文章,并将它转换成UTF8编码字符串之后,html
中的
都变成了聴
,效果非常不理想,那怎么办呢?
仍然是面向google编程(百度已经满足不了我的需求了),无意中看到了golang.org/x/html
包下面有个charset.NewReader(r io.Reader, contentType string)
方法,它可以将reader的内容转换成指定的编码。
// NewReader returns an io.Reader that converts the content of r to UTF-8.
// It calls DetermineEncoding to find out what r's encoding is.
func NewReader(r io.Reader, contentType string) (io.Reader, error) {
preview := make([]byte, 1024)
n, err := io.ReadFull(r, preview)
switch {
case err == io.ErrUnexpectedEOF:
preview = preview[:n]
r = bytes.NewReader(preview)
case err != nil:
return nil, err
default:
r = io.MultiReader(bytes.NewReader(preview), r)
}
if e, _, _ := DetermineEncoding(preview, contentType); e != encoding.Nop {
r = transform.NewReader(r, e.NewDecoder())
}
return r, nil
}
这个方法解了我的燃眉之急,我将返回结果转换成utf8编码,并将爬取的内容存入文件中查看内容,一切都符合预期。
示例代码:
r, _ := charset.NewReader(resp.Body, "UTF-8")
dom, err := goquery.NewDocumentFromReader(r)
if err != nil {
log.Errorln("New Dom error", err)
return ""
}