在go中可以使用goquery库来解析html,这个有点类似于jQuery的库,提供与 jQuery 相近的接口。
一、安装
go get -u github.com/PuerkitoBio/goquery
二、使用
1. 创建goquery对象
使用NewDocument
简单的创建,但不推荐这么用,建议使用http.Get()成功后,装body传给NewDocumentFromReader
创建
doc, err := goquery.NewDocument("https://zengwu.com.cn")
使用NewDocumentFromReader
创建还可以从本地文件或内存中构造对象
res, err := http.Get("https://zengwu.com.cn")
if err != nil {
log.Fatal(err)
}
defer res.Body.Close()
if res.StatusCode != 200 {
log.Fatalf("status code error: %d %s", res.StatusCode, res.Status)
}
doc, err := goquery.NewDocumentFromReader(res.Body)
if err != nil {
log.Fatal(err)
}
2. 查找head
中数据
<html class="theme-next pisces use-motion" lang="zh-CN">
<head>
<meta charset="UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>
<meta name="theme-color" content="#222">
...
如有以上网页头数据,我们要找出charset
编码
// 查找head
head := doc.Find("head")
// 查找meta属性项charset
charset := head.Find("meta[charset]")
// 获取charset中的charset属性值
str, _ := charset.Attr("charset")
fmt.Println(str)
3. 查找html中的id
<nav class="site-nav">
<ul id="menu" class="menu">
<li class="menu-item menu-item-home">
<a href="/" rel="section">
<i class="menu-item-icon fa fa-fw fa-home"></i> <br /> 首页
</a>
</li>
...
如有以上网页头数据,要找出id为menu
的项
menu := doc.Find("#menu")
4. 查找html中的class
还是上面代码,要找出nav class为site-nav
的项
menu := doc.Find("nav.site-nav")
5. 查找所有div或列表数据
<div class="pull-left" style="white-space:nowrap">
01-01
<a href="/p/26da89a5.html" title="将阿里云盘映射成本地磁盘">将阿里云盘映射成本地磁盘</a>
</div><br>
<div class="pull-left" style="white-space:nowrap">
12-05
<a href="/p/c1edbab3.html" title="bat中的enabledelayedexpansion">bat中的enabledelayedexpansion</a>
</div><br>
<div class="pull-left" style="white-space:nowrap">
11-21
<a href="/p/afe6edd9.html" title="Nginx配置跨域">Nginx配置跨域</a>
</div><br>
<div class="pull-left" style="white-space:nowrap">
11-19
<a href="/p/e334394.html" title="curl发送POST请求">curl发送POST请求</a>
</div><br>
<div class="pull-left" style="white-space:nowrap">
11-18
<a href="/p/334d5fc9.html" title="Java中byte数组和String字符串相互转换">Java中byte数组和String字符串相互转换</a>
</div><br>
找出所有class为pull-left的div,然后在每个div下搜索,获取的显示文本内容
var txt = []string{}
doc.Find("div.pull-left").Each(func(i int, s *goquery.Selection) {
a := s.Find("a").Text()
txt = append(txt, a)
})
fmt.Println(txt)