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

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

OWASP十大安全漏洞解析

OWASP(开放式Web应用程序安全项目)发布的“十大安全漏洞”列表是Web应用程序安全领域的权威指南,它总结了Web应用程序中最常见、最危险的安全隐患。以下是对OWASP十大安全漏洞的详细解析: 1. 注入漏洞(Injection) 描述:攻击者通过在应用程序的输入数据中插入恶意代码,从而控制应用程序的行为。常见的注入类型包括SQL注入、OS命令注入、LDAP注入等。 影响:可能导致数据泄

EasyPlayer.js网页H5 Web js播放器能力合集

最近遇到一个需求,要求做一款播放器,发现能力上跟EasyPlayer.js基本一致,满足要求: 需求 功性能 分类 需求描述 功能 预览 分屏模式 单分屏(单屏/全屏) 多分屏(2*2) 多分屏(3*3) 多分屏(4*4) 播放控制 播放(单个或全部) 暂停(暂停时展示最后一帧画面) 停止(单个或全部) 声音控制(开关/音量调节) 主辅码流切换 辅助功能 屏

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

Python3 BeautifulSoup爬虫 POJ自动提交

POJ 提交代码采用Base64加密方式 import http.cookiejarimport loggingimport urllib.parseimport urllib.requestimport base64from bs4 import BeautifulSoupfrom submitcode import SubmitCodeclass SubmitPoj():de

多线程解析报表

假如有这样一个需求,当我们需要解析一个Excel里多个sheet的数据时,可以考虑使用多线程,每个线程解析一个sheet里的数据,等到所有的sheet都解析完之后,程序需要提示解析完成。 Way1 join import java.time.LocalTime;public class Main {public static void main(String[] args) thro

ZooKeeper 中的 Curator 框架解析

Apache ZooKeeper 是一个为分布式应用提供一致性服务的软件。它提供了诸如配置管理、分布式同步、组服务等功能。在使用 ZooKeeper 时,Curator 是一个非常流行的客户端库,它简化了 ZooKeeper 的使用,提供了高级的抽象和丰富的工具。本文将详细介绍 Curator 框架,包括它的设计哲学、核心组件以及如何使用 Curator 来简化 ZooKeeper 的操作。 1