golang解析网页的第三方包——goquery(爬虫必备)

2024-01-05 17:38

本文主要是介绍golang解析网页的第三方包——goquery(爬虫必备),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

goquery是一个使用go语言写成的HTML解析库,可以让你像jQuery那样的方式来操作DOM文档,使用起来非常的简便。

 

一、官网下载地址

   https://github.com/PuerkitoBio/goquery

二、goquery提供的主要结构体和方法

 

2.1. Document    代表一个HTML文档,

      type Document struct {
        *Selection  
       Url      *url.URL
       rootNode *html.Node
      }


 1  Document 继承了Selection 类型,因此,Document 可以直接使用 Selection 类型的方法。

 2  Document初始化的五种方式

  1)根据根节点初始化

  func NewDocumentFromNode(root *html.Node) *Document {
     return newDocument(rootnil)
  }

 

 2)根据url初始化,比较常用

  func NewDocument(url string) (*Documenterror) {
   // Load the URL
   rese := http.Get(url)   //根据url获取该网页的内容  res
   if e != nil {
      return nile
   }
   return NewDocumentFromResponse(res)
}

 

 3)根据io的Reader初始化

   func NewDocumentFromReader(r io.Reader) (*Documenterror) {
     roote := html.Parse(r)
     if e != nil {
        return nile
     }
     return newDocument(rootnil)nil
  }

 

  

  4) 根据httpResponse初始化,也比较常用

 func NewDocumentFromResponse(res *http.Response) (*Documenterror) {
   if res == nil //res为空,返回错误
      return nilerrors.New("Response is nil")
   }
   defer res.Body.Close()  //读取错误或者返回结果后关闭
   if res.Request == nil //如果resRequest为空,返回
      return nilerrors.New("Response.Request is nil")
   }

   // Parse the HTML into nodes
   roote := html.Parse(res.Body)   //html结果解析并返回一个根节点rootNode
   if e != nil {
      return nile
   }

   // Create and fill the document
   return newDocument(rootres.Request.URL)nil
}

 

  5) 复制一个文档对象

func CloneDocument(doc *Document) *Document {
   return newDocument(cloneNode(doc.rootNode)doc.Url)
}

 

 

2.2.Selection   Selection匹配一些条件后的节点集合(Nodes)

  type Selection struct {
     Nodes    []*html.Node
     document *Document
     prevSel  *Selection
  }

 

2.3 Selection类型提供的方法,这些方法是页面解析最重要,最核心的方法

1)类似函数的位置操作

 

   -  Eq(index int) *Selection     //根据索引获取某个节点集

  -  First() *Selection          //获取第一个子节点

  -  Last() *Selection         //获取最后一个子节点集

  -  Next() *Selection         //获取下一个兄弟节点

  -  NextAll() *Selection      //获取后面所有兄弟节点

  -  Prev() *Selection         //前一个兄弟节点

  - Get(index int) *html.Node  //根据索引获取一个节点

  - Index() int                //返回选择对象中第一个元素的位置 

  - Slice(start, end int) *Selection  //根据起始位置获取子节点集

 

 

2)扩大 Selection 集合(增加选择的节点)

    -  Add(selector string) *Selection //将匹配到的节点添加当前节点集合中

    -   AndSelf() *Selection    //将堆栈上的前一组元素添加到当前的

     -    Union() *Selection    //which is an alias for AddSelection()

 

3)过滤方法,减少节点集合

   -  End() *Selection

    - Filter…()     //过滤

    - Has…()
    - Intersection()   //which is an alias of FilterSelection()
     - Not…()

 

4)循环遍历选择的节点

         -  Each(f func(int, *Selection)) *Selection //遍历

        - EachWithBreak(f func(int, *Selection) bool) *Selection  //可中断遍历

       - Map(f func(int, *Selection) string) (result []string)  //返回字符串数组

 

 5)修改文档

      - After…()            //在匹配元素之后追加元素
      - Append…()         //将选择器指定的元素添加到匹配元素集合的每个元素的末尾
     - Before…()          //在匹配元素之前追加元素
    - Clone()             //创建匹配节点的副本
    - Empty()            //清空子节点
    - Prepend…()
    - Remove…()
    - ReplaceWith…()
    - Unwrap()
    - Wrap…()
    - WrapAll…()
    - WrapInner…()

 

  6)检测或获取节点属性值

      - Attr(), RemoveAttr(), SetAttr()  //获取,移除,设置属性的值
     - AddClass(), HasClass(), RemoveClass(), ToggleClass() 
     - Html()  //获取该节点的html
     - Length() //返回该Selection的元素个数
     - Size(), which is an alias for Length()
     - Text()  //获取该节点的文本值

 

7)查询或显示一个节点的身份

     - Contains() //包含
      - Is…()

 

8)在文档树之间来回跳转(常用的查找节点方法)

      - Children…()
      - Contents()
      - Find…()
      - Next…()
      - Parent[s]…()
      - Prev…()
      - Siblings…()

 

三、例子

func main() {
   docerr := goquery.NewDocument(url)
   if err!=nil{
      log4go.Error(err)
   }else{

      doc.Find(selector string).Each(func(i int,s *goquery.Selection) { //获取节点集合并遍历
         text:=s.Find(selector string).Text() //获取匹配节点的文本值
         fmt.Println(text)
    })

   }
}









参考文章:http://blog.studygolang.com/tag/goquery/

 

这篇关于golang解析网页的第三方包——goquery(爬虫必备)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/573638

相关文章

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

golang版本升级如何实现

《golang版本升级如何实现》:本文主要介绍golang版本升级如何实现问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录golanwww.chinasem.cng版本升级linux上golang版本升级删除golang旧版本安装golang最新版本总结gola

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

golang中reflect包的常用方法

《golang中reflect包的常用方法》Go反射reflect包提供类型和值方法,用于获取类型信息、访问字段、调用方法等,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值... 目录reflect包方法总结类型 (Type) 方法值 (Value) 方法reflect包方法总结

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

使用Python绘制3D堆叠条形图全解析

《使用Python绘制3D堆叠条形图全解析》在数据可视化的工具箱里,3D图表总能带来眼前一亮的效果,本文就来和大家聊聊如何使用Python实现绘制3D堆叠条形图,感兴趣的小伙伴可以了解下... 目录为什么选择 3D 堆叠条形图代码实现:从数据到 3D 世界的搭建核心代码逐行解析细节优化应用场景:3D 堆叠图

深度解析Python装饰器常见用法与进阶技巧

《深度解析Python装饰器常见用法与进阶技巧》Python装饰器(Decorator)是提升代码可读性与复用性的强大工具,本文将深入解析Python装饰器的原理,常见用法,进阶技巧与最佳实践,希望可... 目录装饰器的基本原理函数装饰器的常见用法带参数的装饰器类装饰器与方法装饰器装饰器的嵌套与组合进阶技巧