go 语言做服务器端开发,有时候需要解析 HTML 文件,比如抓取网站内容、写一个爬虫等。这时候如果有一个类似 jQuery 的库可以使用,操作 DOM 会很方便,而且,上手也会很快。goquery 就可以实现类似效果
首先我们下载源码
go get github.com/PuerkitoBio/goquery
下面实现源码:
package main
import (
"github.com/PuerkitoBio/goquery"
"log"
"fmt"
"encoding/json"
)
/*
爬取大众点评网站
*/
var detailUrl = "http://www.dianping.com/shop/32489357"
type dianpingInfo struct {
Title string
Comment_count string //评论数
Per string //人均
Flavor string //口味
Env string //环境
Service string //服务
Address string
Phone string
}
func detailPage(url string) *dianpingInfo {
doc,err := goquery.NewDocument(url)
if err != nil {
log.Println("抓取失败 URL:",url)
return new(dianpingInfo)
}
info := doc.Find("div#basic-info")
title := info.Find("div.shop-name").Text()
comment_count := info.Find("div#reviewCount").Text()
per := info.Find("span#avgPriceTitle").Text()
//遍历 item
ret := info.Find("span#comment_score .item").Map(func(i int, s *goquery.Selection) string {
tmp := s.Text()
return tmp
})
address := info.Find("div.expand-info").Text()
phone := info.Find("p.tel .info-name").Next().Text()
dp := dianpingInfo{Title:title,Comment_count:comment_count,
Per:per,Flavor:ret[0],Env:ret[1],Service:ret[2],
Address:address,Phone:phone}
return &dp
}
func main() {
dp := detailPage(detailUrl)
str,err := json.Marshal(dp)
if err != nil {
log.Println(err)
}
fmt.Println(string(str))
}