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

2021-07-15  本文已影响0人  卡门001

爬虫内容过滤的主要步骤:先用css选择器,go的选择器 golang.org/x/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 使用 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])
    }
}
上一篇下一篇

猜你喜欢

热点阅读