go實用小技能-遍歷html元素
阿新 • • 發佈:2019-01-07
我們在編寫爬蟲軟體或者抓取某一個單一網頁的時候,一般都是使用正則表示式技術獲取需要的內容。這種方式比較靈活,但是使用門檻較高,而且效率不高,很多不瞭解正則表示式語法的小夥伴面對一連串符號看起來就是像在看天書一樣。
今天給大家分享的是golang官方開源的net/html包, 這個包給我們封裝瞭解析的html元素用到的基礎方法。下載地址 https://github.com/golang/net
不能直接使用git clone 的方式下載原始碼,必須使用go get 命令獲取
<!DOCTYPE html>
<html>
<head>
<title >This is a demo</title>
</head>
<body>
這是body下面的示例一
<a href="http://shang.qq.com/wpa/qunwpa?idkey=1720f7b75f19d952b80e10549ce35c6cc922c25b6505cd6f6680ac4fc7259484">
歡迎加入 dogo 技術交流群:437274005 點選右側按鈕快捷加入
</a>
<img src="https://github.com/wuciyou/dogo/blob/master/example/web/static/img/dogo.png" >
這是body下面的示例二
</body>
</html>
package main
import (
"golang.org/x/net/html"
"log"
"os"
)
func main() {
f, err := os.Open("./demo.html")
if err != nil {
log.Panic(err)
}
doc, err := html.Parse(f)
if err != nil {
log.Panic(err)
}
// log.Printf ("doc:%+v \n ", doc)
var parse func(*html.Node)
parse = func(n *html.Node) {
// log.Printf("node type:%d ", n.Type)
// switch n.Type {
// case html.ErrorNode:
// log.Printf("ErrorNode(%p):%+v", n, n)
// case html.TextNode:
// log.Printf("TextNode(%p):%+v", n, n)
// case html.DocumentNode:
// log.Printf("DocumentNode(%p):%+v", n, n)
// case html.ElementNode:
// log.Printf("ElementNode(%p):%+v", n, n)
// case html.CommentNode:
// log.Printf("CommentNode(%p):%+v", n, n)
// case html.DoctypeNode:
// log.Printf("DoctypeNode(%p):%+v", n, n)
// }
if n.Type == html.ElementNode && n.Data == "a" {
if n.FirstChild != nil && n.FirstChild.Type == html.TextNode {
log.Printf("href:%s, text:%s \n", n.Attr[0].Val, n.FirstChild.Data)
} else {
log.Printf("href:%s \n", n.Attr[0].Val)
}
}
for c := n.FirstChild; c != nil; c = c.NextSibling {
parse(c)
}
}
parse(doc)
}