整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

GoQuery - Go语言的jQuery

GoQuery - Go语言的jQuery

惯了使用 jQuery 的 $(...) 语法来查询和操作 DOM 元素,那换种语言,用 Go 语言该怎么实现呢?来看看 goquery 吧!

HTML网页DOM树

简介

goquery,是 github 上 PuerkitoBio 开源的 Go 语言库,代码仓库在 https://github.com/PuerkitoBio/goquery。goquery 是一个用于查询和操作 DOM 元素的库,并采用了尽可能与 jQuery 相似的语法,以降低学习难度和使用门槛。

Go语言

安装

goquery 需要 Go 1.1 以上版本,使用 go get 直接安装:

go get github.com/PuerkitoBio/goquery


目前的版本为 v1.5.1,依赖包括 net/html 和 CSS 选择器 cascadia。


示例

goquery 主要使用了两个结构体 Document (文档) 和 Selection (选择)。Document 代表了一个解析之后的 HTML 文档,而 Selection 则代表了进行查询后得到的 DOM 结点集合。Document 的定义中嵌入了 Selection,故而 Document 可使用 Selection 的方法。

下面给出一个 goquery 的使用例子:

package main

import (
    "fmt"
    "log"
    "net/http"

    "github.com/PuerkitoBio/goquery"
)

func ExampleScrape() {
    // 请求HTML页面.
    res, err :=http.Get("http://metalsucks.net")
    if err !=nil {
        log.Fatal(err)
    }
    defer res.Body.Close()
    if res.StatusCode !=200 {
        log.Fatalf("status code error: %d %s", res.StatusCode, res.Status)
    }

    // 解析HTML生成goquery文档.
    doc, err :=goquery.NewDocumentFromReader(res.Body)
    if err !=nil {
        log.Fatal(err)
    }

    // 在文档中进行查找.
    doc.Find(".sidebar-reviews article .content-block").Each(func(i int, s *goquery.Selection) {
        // 对于查找到的每一项,进一步获取目标文本内容.
        band :=s.Find("a").Text()
        title :=s.Find("i").Text()
        fmt.Printf("Review %d: %s - %s\n", i, band, title)
    })
}

func main() {
    ExampleScrape()
}

该例子对一个新闻类网站进行了解析,并获取每一条新闻的标题等文本信息。

我们首先使用 net/http 进行 HTTP 请求,得到目标网站的响应。然后,使用了goquery 的 NewDocumentFromReader 来从响应读取并解析得到一个 HTML 文档。NewDocumentFromReader 是这样定义的:

func NewDocumentFromReader(r io.Reader) (*Document, error)

然后,使用 Selection 的 Find 方法进行查找,返回查询结果,对应 jQuery 中的 find 函数:

func (s *Selection) Find(selector string) *Selection

对于结果集合,使用 Selection 的 Each 方法进行遍历,对应 jQuery 中的 each 函数:

func (s *Selection) Each(f func(int, *Selection)) *Selection

对于遍历的每一项,再次使用 Find 查找子元素,并利用 Text 方法获得元素的文本,对应 jQuery 的 text 函数:

func (s *Selection) Text() string


总结

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

goquery库方便了 Go 语言进行网页抓取和解析的工作,使得Go语言在该领域有了门槛较低、使用方便的工具。

goquery库目前已经历了数年的开发,代码质量较高,注释丰富,值得研究学习。

JavaScript中,有时您需要访问HTML元素。querySelector方法是一个Web API,它选择与传入的指定CSS选择器匹配的第一个元素。

但是,更详细地说,这是如何工作的呢?在本文中,我们将看一些如何使用querySelector方法以及querySelectorAll方法的示例。

(本文内容参考:java567.com)

提:

用python写了一个简单的log分析,主要也就是查询一些key,value出来,后面也可以根据需求增加。查询出来后,为了好看,搞个html 表格来显示。

需要的组件: jinja2 flask 的模板。

先说下设计思路,主要是练习python代码玩,高手略过

模拟scrapy,搞个管线


每个管线分预处理,分析器,和后处理。预处理的话,可以筛选下数据,分析器提取关键信息,然后把结果丢给后处理。html报表就是在后处理生成。

再搞个manger类,管理很多个管线,虽然现在单路pipeLine就完成了,说不定以后还能扩展呢。



我们可以定义预处理,比如过滤一些不关注的关键字,或者关注一些特定关键字的行


预处理的话,只处理QtiDCT-C关键字的日志行。

然后把经过预处理后的数据丢给分析器

主要查询行数据行里面是否有keyword,然后根据分隔符,和结束符来提取内容

keyword delimiter xxxxxendwith 这样个模式

获取最终结果存储到字典里面 result[keyword]=xxxx。这里会trim,去掉 \r\n.

这样就有了结果集result.最后丢给posthandler 后处理。完成报表输出。


后处理主要是用jinja2的模板,然后传递参数,生成最终的html文件。

这里的jinja_template.temple, 内容如下



有了模板,就可以在渲染模板的时候提供字典,变量,在模板里面显示。最终完成报表的输出。


最终使用


最终在main 方法中,通过-d参数传入log所在目录,然后迭代所有的文件,使用input 把文本文件转换成行数据的list,丢给管线,最后把管线丢给manager,调用process ,完成txt日志的分析,到最后html的生产。