美文网首页
GO学习笔记(25) - 爬虫(2) - 选择器等工具

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

作者: 卡门001 | 来源:发表于2021-07-15 12:05 被阅读0次

    爬虫内容过滤的主要步骤:先用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])
        }
    }
    

    相关文章

      网友评论

          本文标题:GO学习笔记(25) - 爬虫(2) - 选择器等工具

          本文链接:https://www.haomeiwen.com/subject/jlohpltx.html