goquery是Go语言编写的用来解析HTML的库,类似jQuery。它基于 HTML 解析库net/html和 CSS 库cascadia,提供与 jQuery 相近的接口。Go 著名的爬虫框架colly就是基于 goquery 的。
安装
go get -u github.com/PuerkitoBio/goquery
使用
import (
"fmt"
"net/http"
"github.com/PuerkitoBio/goquery"
)
func main() {
url := "https://xxx.com"
client := &http.Client{
}
req, _ := http.NewRequest("GET", url, nil)
req.Header.Set("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36")
resp, _ := client.Do(req)
doc, _ := goquery.NewDocumentFromReader(resp.Body)
nodes := doc.Find(".J_player_container")
fmt.Println(nodes.Attr("data-video"))
title_node := doc.Find("meta[name=\"twitter:title\"]")
fmt.Println(title_node.Attr("content"))
}
goquery.NewDocumentFromReader
用来创建文档对象,参数是utf-8编码的io.Reader。
如果网页是gb2312编码,需要转码:
utf8Body, err := iconv.NewReader(res.Body, "gb2312", "utf-8")
自动判断编码格式
func detectContentCharset(body io.Reader) string {
r := bufio.NewReader(body)
if data, err := r.Peek(1024); err == nil {
if _, name, _ := charset.DetermineEncoding(data, ""); len(name) != 0 {
return name
}
}
return "utf-8"
}
func DecodeHTMLBody(body io.Reader, charset string) (io.Reader, error) {
if charset == "" {
charset = detectContentCharset(body)
}
e, err := htmlindex.Get(charset)
if err != nil {
return nil, err
}
if name, _ := htmlindex.Name(e); name != "utf-8" {
body = e.NewDecoder().Reader(body)
}
return body, nil
}
这里用到了x/net/html/charset:
go get -u golang.org/x/text
charset.DetermineEncoding会根据 HTML 页面中的 meta 元信息猜测网页编码。
utf8Body, err := DecodeHTMLBody(res.Body, "")
参考
https://github.com/PuerkitoBio/goquery
https://pkg.go.dev/golang.org/x/net/html/charset
https://zhuanlan.zhihu.com/p/264823205