Go语言用goquery解析HTML

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

猜你喜欢

转载自blog.csdn.net/lilongsy/article/details/129263224
今日推荐