慣了使用 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的生產。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。