GO学习笔记(22) - 爬虫(2) - 选择器等工具

133 阅读1分钟

爬虫内容过滤的主要步骤:先用css选择器,go的选择器 golang.org/x/net/html,再用表达式对所选内容,再做一个过滤。本文针对主要技术点做说明。

目录

  • 获取页面编码
  • css选择器
  • 正则表达式
  • Parser解析器

获得页面编码

  • net/html安装
//go get golang.org/x/net/html
  • 示例
//r的参数为response.Body
func determinEncoding(r io.Reader) encoding.Encoding{
	bytes,err := bufio.NewReader(r).Peek(1024)
	if err != nil {
		panic(err)
	}
	encoding,_,_ := charset.DetermineEncoding(bytes,"")
	return encoding
}

func main(){
      resp,err := http.Get(...)
	if  err!=nil{
		panic(err)
	}
	defer resp.Body.Close()

	if resp.StatusCode != http.StatusOK {
		fmt.Println("Error: status code",resp.StatusCode)
	}

	//编码
	e := determinEncoding(resp.Body)
	//按编码转换爬虫而来的数据,依赖golang.org/x/text
	utf8Reader := 
      transform.NewReader(resp.Body,e.NewDecoder())
       ...
}

goquery之css选择器介绍

  • 介绍 Goquery,是 github 上 PuerkitoBio 开源的 Go 语言库,代码仓库在 https://github.com/PuerkitoBio/goquery

goquery 使用 Go 语言实现了与 jQuery 尽可能相似的查询和操作语法,包括 CSS 选择语法和绝大部分的操作函数,方便熟悉 jQuery 的 Go 语言开发人员快速完成 HTML 文档的解析和查询操作。

jQuery 的 $(...) 语法来查询和操作 DOM 元素。

  • 安装
go get github.com/PuerkitoBio/goquery
  • 使用
doc,err :=goquery.NewDocumentFromReader(utf8Reader)
if err != nil{
    panic(err)
}

doc.Find("dl.city-list>dd").Each(
    func(i int, sel *goquery.Selection) {
	  content,_ := sel.Html()
	  if err == nil{
		fmt.Println(content)
	}
  })

正则表达式

package main

import (
	"fmt"
	"regexp"
)

const text = `My email is ccmouse@gmail.com@abc
	email is : test1@sina.com
    email is : abc@github.org
	email is : nianxl@dd.com.cn
`
func main() {
	//提取邮件
	re := regexp.MustCompile(`[a-zA-Z0-9]+@[a-zA-Z0-9]+.[a-zA-Z0-9]+[.][a-zA-Z0-9]+`)
	val := re.FindAllString(text,-1) //-1代表全部
	fmt.Printf("邮件列表为:%s \n",val)

	//提到邮件后半部分的域名:需要加分组
	re1 := regexp.MustCompile(`([a-zA-Z0-9]+)@([a-zA-Z0-9]+.[a-zA-Z0-9]+[.][a-zA-Z0-9]+)`)
	domainVal := re1.FindAllStringSubmatch(text,-1)
	fmt.Print("\n提取的域名列表为:")
	for i,_ := range domainVal{
		fmt.Printf("%s ",domainVal[i][2])
	}
}