- 取得連結
- X
- 以電子郵件傳送
- 其他應用程式
程式語言:Go
Package:goquery
官方文件
官方 GitHub
功能:jquery-like 分析 html
jQuery Selectors
必需自行處理成 UTF-8 編碼,才丟進 goquery 處理
Package:goquery
官方文件
官方 GitHub
功能:jquery-like 分析 html
jQuery Selectors
必需自行處理成 UTF-8 編碼,才丟進 goquery 處理
package main import ( "bytes" "fmt" "io/ioutil" "log" "net/http" "github.com/PuerkitoBio/goquery" "golang.org/x/text/encoding/traditionalchinese" "golang.org/x/text/transform" ) func main() { // Request the HTML page. res, err := http.Get("https://www.google.com.tw/") 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) } b, err := ioutil.ReadAll(res.Body) // goquery 限定需為 UTF-8 b, _ = DecodeBig5(b) r := bytes.NewReader(b) // Load the HTML document dom, err := goquery.NewDocumentFromReader(r) if err != nil { log.Fatal(err) } data := make(map[string]string) // Find the link items dom.Find("a").Each(func(i int, s *goquery.Selection) { // For each item found, get the band and title title := s.Text() url, _ := s.Attr("href") data[title] = url }) fmt.Printf("%+v", data) } //convert BIG5 to UTF-8 func DecodeBig5(s []byte) ([]byte, error) { I := bytes.NewReader(s) O := transform.NewReader(I, traditionalchinese.Big5.NewDecoder()) b, err := ioutil.ReadAll(O) if err != nil { return nil, err } return b, nil } //convert UTF-8 to BIG5 func EncodeBig5(s []byte) ([]byte, error) { I := bytes.NewReader(s) O := transform.NewReader(I, traditionalchinese.Big5.NewEncoder()) b, err := ioutil.ReadAll(O) if err != nil { return nil, err } return b, nil }
package main import ( "bufio" "fmt" "io" "log" "net/http" "github.com/PuerkitoBio/goquery" "github.com/pkg/errors" "golang.org/x/net/html/charset" "golang.org/x/text/encoding" "golang.org/x/text/transform" ) func main() { // Request the HTML page. resp, err := http.Get("http://www.zhenai.com/zhenghun") if err != nil { panic(err) } defer resp.Body.Close() if resp.StatusCode != 200 { log.Fatalf("status code error: %d %s", resp.StatusCode, resp.Status) } // 自動判斷編碼,轉為 UTF-8,需注意有時會判斷錯誤 e, _, _, _ := DetermineEncodingFromReader(resp.Body) utf8Reader := transform.NewReader(resp.Body, e.NewDecoder()) // Load the HTML document dom, err := goquery.NewDocumentFromReader(utf8Reader) if err != nil { log.Fatal(err) } data := make(map[string]string) // Find the link items dom.Find("a").Each(func(i int, s *goquery.Selection) { // For each item found, get the band and title title := s.Text() url, _ := s.Attr("href") data[title] = url }) fmt.Printf("%+v", data) } // DetermineEncodingFromReader 偵測 reader 的編碼 func DetermineEncodingFromReader(r io.Reader) (encoding.Encoding, string, bool, error) { b, err := bufio.NewReader(r).Peek(1024) if err != nil { fmt.Printf("r: %s : %s", r, err) err = errors.Wrap(err, "bufio.NewReader") return nil, "", false, err } e, name, certain := charset.DetermineEncoding(b, "") return e, name, certain, nil }
讀取網頁
package main import ( "fmt" "log" "strings" "github.com/PuerkitoBio/goquery" ) func main() { html := "" // Load the HTML document dom, err := goquery.NewDocumentFromReader(strings.NewReader(html)) if err != nil { log.Fatal(err) } str, _ := dom.Html() fmt.Printf("%s", str) }
使用範例
html 如下html := ` <html> <head><title>The Dormouse's story</title></head> <body> <p class="title"><b>The Dormouse's story</b></p> <p class="story">Once upon a time there were three little sisters; and their names were <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>, <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>; and they lived at the bottom of a well. </p> <p class="story">...</p>` // Load the HTML document dom, err := goquery.NewDocumentFromReader(strings.NewReader(html)) if err != nil { log.Fatal(err) } var sel *goquery.Selection
訪問方法
幾乎等同 jQuery,可參考 [jQuery] 基本架構
可將 dom 視為 $,可理解到 goquery & jQuery 差異極小
sel = dom.Find("a") prettyPrint(sel.Nodes) // "a" [{ href http://example.com/elsie} { class sister} { id link1}] // "a" [{ href http://example.com/lacie} { class sister} { id link2}] // "a" [{ href http://example.com/tillie} { class sister} { id link3}] sel = dom.Find("a.sister#link1") prettyPrint(sel.Nodes) // "a" [{ href http://example.com/elsie} { class sister} { id link1}]
搜尋方法
sel = dom.Find("p").Children() prettyPrint(sel.Nodes) // "b" [] // "a" [{ href http://example.com/elsie} { class sister} { id link1}] // "a" [{ href http://example.com/lacie} { class sister} { id link2}] // "a" [{ href http://example.com/tillie} { class sister} { id link3}] sel = dom.Find("p").ChildrenFiltered("#link1") prettyPrint(sel.Nodes) // "a" [{ href http://example.com/elsie} { class sister} { id link1}]
sel = dom.Find("p.title").Siblings() prettyPrint(sel.Nodes) // "p" [{ class story}] // "p" [{ class story}] sel = dom.Find("a#link2").Siblings() prettyPrint(sel.Nodes) // "a" [{ href http://example.com/elsie} { class sister} { id link1}] // "a" [{ href http://example.com/tillie} { class sister} { id link3}] sel = dom.Find("a#link2").SiblingsFiltered("#link1") prettyPrint(sel.Nodes) // "a" [{ href http://example.com/elsie} { class sister} { id link1}]
// 除 children 外,包含 text nodes sel = dom.Find("body").Contents() prettyPrint(sel.Nodes) // "\n " [] // "p" [{ class title}] // "\n " [] // "p" [{ class story}] // "\n " [] // "p" [{ class story}]
// 含自己往上找,找到最接近的 parents sel = dom.Find("a").Closest("a") prettyPrint(sel.Nodes) // "a" [{ href http://example.com/elsie} { class sister} { id link1}] // "a" [{ href http://example.com/lacie} { class sister} { id link2}] // "a" [{ href http://example.com/tillie} { class sister} { id link3}] sel = dom.Find("a").Closest("p") prettyPrint(sel.Nodes) // "p" [{ class story}]
// 找到其 parent,只往上查找一層,會自動移除重覆的 sel = dom.Find("a").Parent() prettyPrint(sel.Nodes) // "p" [{ class story}] sel = dom.Find("a").ParentFiltered("body") prettyPrint(sel.Nodes) // None
// 找到其 parents,往上查找不停止,找出所有符合條件的,會自動移除重覆的 sel = dom.Find("a").Parents() prettyPrint(sel.Nodes) // "p" [{ class story}] // "body" [] // "html" [] sel = dom.Find("a").ParentsFiltered("body") prettyPrint(sel.Nodes) // "body" []
// 選擇第一個 sel = dom.Find("a").Eq(0) prettyPrint(sel.Nodes) // "a" [{ href http://example.com/elsie} { class sister} { id link1}]
// 可為 string 也可以是 function sel = dom.Find("p").Filter(".story") prettyPrint(sel.Nodes) // "p" [{ class story}] // "p" [{ class story}] sel = dom.Find("p").FilterFunction(func(i int, s *goquery.Selection) bool { return s.Text() == "..." }) prettyPrint(sel.Nodes) // "p" [{ class story}]
sel = dom.Find("a").Not("#link1") prettyPrint(sel.Nodes) // "a" [{ href http://example.com/lacie} { class sister} { id link2}] // "a" [{ href http://example.com/tillie} { class sister} { id link3}]
sel = dom.Find("a#link2").Next() prettyPrint(sel.Nodes) // "a" [{ href http://example.com/tillie} { class sister} { id link3}] sel = dom.Find("a#link2").NextFiltered("a") prettyPrint(sel.Nodes) // "a" [{ href http://example.com/tillie} { class sister} { id link3}]
sel = dom.Find("a#link2").Prev() prettyPrint(sel.Nodes) // "a" [{ href http://example.com/elsie} { class sister} { id link1}] sel = dom.Find("a#link2").PrevFiltered("a") prettyPrint(sel.Nodes) // "a" [{ href http://example.com/elsie} { class sister} { id link1}]
sel = dom.Find("a#link1").NextAll() prettyPrint(sel.Nodes) // "a" [{ href http://example.com/lacie} { class sister} { id link2}] // "a" [{ href http://example.com/tillie} { class sister} { id link3}] sel = dom.Find("a#link1").NextAllFiltered("#link3") prettyPrint(sel.Nodes) // "a" [{ href http://example.com/tillie} { class sister} { id link3}]
sel = dom.Find("a#link3").PrevAll() prettyPrint(sel.Nodes) // "a" [{ href http://example.com/lacie} { class sister} { id link2}] // "a" [{ href http://example.com/elsie} { class sister} { id link1}] sel = dom.Find("a#link3").PrevAllFiltered("#link1") prettyPrint(sel.Nodes) // "a" [{ href http://example.com/elsie} { class sister} { id link1}]
// 回傳上一個 filter 結果 sel = dom.Find("a").Parent().End() // 等同 sel = dom.Find("a") prettyPrint(sel.Nodes) // "a" [{ href http://example.com/elsie} { class sister} { id link1}] // "a" [{ href http://example.com/lacie} { class sister} { id link2}] // "a" [{ href http://example.com/tillie} { class sister} { id link3}]
Attributes
// 會以第一個 a 為主 sel = dom.Find("a") fmt.Println(sel.Attr("id")) // link1 true fmt.Println(sel.AttrOr("noid", "nil")) // nil sel = dom.Find("a") fmt.Println(sel.Attr("class")) // sister true fmt.Println(sel.AttrOr("noclass", "nil")) // nil
// 只要任何 elements 有就是 True sel = dom.Find("p") fmt.Println(sel.HasClass("story")) // true
// 回傳所有元件的 text sel = dom.Find("title") fmt.Println(sel.Text()) // The Dormouse's story
Properties
// 兩者意義一樣 sel = dom.Find("a") fmt.Println(sel.Length()) // 3 fmt.Println(sel.Size()) // 3
網頁內容
sel = dom.Find("head") fmt.Println(sel.Html()) //<title>The Dormouse's story</title> <nil>
sel = dom.Find("head") fmt.Println(goquery.OuterHtml(sel)) // <head><title>The Dormouse's story</title></head> <nil>
更改方法
// # 複製原本的內容並回傳,可用在不想被更改的元件上 var domCopy *goquery.Selection domCopy = dom.Find(".title").Clone()
// # 會將原本的 class 替換掉 domCopy = dom.Clone() sel = domCopy.Find("a").SetAttr("class", "classA") prettyPrint(sel.Nodes) // "a" [{ href http://example.com/elsie} { class classA} { id link1}] // "a" [{ href http://example.com/lacie} { class classA} { id link2}] // "a" [{ href http://example.com/tillie} { class classA} { id link3}] domCopy = dom.Clone() sel = domCopy.Find("a#link2").SetAttr("id", "link4") prettyPrint(domCopy.Find("a").Nodes) // "a" [{ href http://example.com/elsie} { class sister} { id link1}] // "a" [{ href http://example.com/lacie} { class sister} { id link4}] // "a" [{ href http://example.com/tillie} { class sister} { id link3}]
// # 保留原本的 class domCopy = dom.Clone() sel = domCopy.Find("a").AddClass("classB") prettyPrint(sel.Nodes) // "a" [{ href http://example.com/elsie} { class sister classB} { id link1}] // "a" [{ href http://example.com/lacie} { class sister classB} { id link2}] // "a" [{ href http://example.com/tillie} { class sister classB} { id link3}]
domCopy = dom.Clone() sel = domCopy.Find("p").RemoveClass("story") prettyPrint(sel.Nodes) // "p" [{ class title}] // "p" [] // "p" []
domCopy = dom.Clone() sel = domCopy.Find("a").ToggleClass("brother").ToggleClass("sister") prettyPrint(sel.Nodes) // "a" [{ href http://example.com/elsie} { class brother} { id link1}] // "a" [{ href http://example.com/lacie} { class brother} { id link2}] // "a" [{ href http://example.com/tillie} { class brother} { id link3}]
domCopy = dom.Clone() sel = domCopy.Find("a").SetAttr("val", "123") prettyPrint(sel.Nodes) // "a" [{ href http://example.com/elsie} { class sister} { id link1} { val 123}] // "a" [{ href http://example.com/lacie} { class sister} { id link2} { val 123}] // "a" [{ href http://example.com/tillie} { class sister} { id link3} { val 123}]
domCopy = dom.Clone() sel = domCopy.Find("a").RemoveAttr("class") prettyPrint(sel.Nodes) // "a" [{ href http://example.com/elsie} { id link1}] // "a" [{ href http://example.com/lacie} { id link2}] // "a" [{ href http://example.com/tillie} { id link3}]
domCopy = dom.Clone() sel = domCopy.Find(".title").SetText("123") fmt.Println(goquery.OuterHtml(sel)) // # 原來的 <b> 被移除了 // <p class="title">123</p> <nil>
domCopy = dom.Clone() sel = domCopy.Find(".title").BeforeHtml("<div>before</div>") fmt.Println(domCopy.Find("body").Html()) // <div>before</div><p class="title"><b>The Dormouse's story</b></p>
domCopy = dom.Clone() sel = domCopy.Find(".title").AfterHtml("<div>after</div>") fmt.Println(domCopy.Find("body").Html()) // <p class="title"><b>The Dormouse's story</b></p><div>after</div>
domCopy = dom.Clone() sel = domCopy.Find(".title").PrependHtml("<div>prepend</div>") fmt.Println(goquery.OuterHtml(sel)) // <p class="title"><div>prepend</div><b>The Dormouse's story</b></p>
domCopy = dom.Clone() sel = domCopy.Find(".title").AppendHtml("<div>append</div>") fmt.Println(goquery.OuterHtml(sel)) // <p class="title"><b>The Dormouse's story</b><div>append</div></p>
// 將 prepend 元件放到 find 所有元件裡面的前面,原本的 prepend 元件仍存在 domCopy = dom.Clone() sel = domCopy.Find("a").Prepend("title") fmt.Println(domCopy.Find("body").Html()) fmt.Println("=============") // <p class="title"><b>The Dormouse's story</b></p> // <p class="story">Once upon a time there were three little sisters; and their names were // <a href="http://example.com/elsie" class="sister" id="link1"><title>The Dormouse's story</title>Elsie</a>, // <a href="http://example.com/lacie" class="sister" id="link2"><title>The Dormouse's story</title>Lacie</a> and // <a href="http://example.com/tillie" class="sister" id="link3"><title>The Dormouse's story</title>Tillie</a>; // and they lived at the bottom of a well. // </p>
//將 append 元件放到 find 所有元件裡面的後面,原本的 append 元件仍存在 domCopy = dom.Clone() sel = domCopy.Find("a").Append("title") fmt.Println(domCopy.Find("body").Html()) fmt.Println("=============") // <p class="title"><b>The Dormouse's story</b></p> // <p class="story">Once upon a time there were three little sisters; and their names were // <a href="http://example.com/elsie" class="sister" id="link1">Elsie<title>The Dormouse's story</title></a>, // <a href="http://example.com/lacie" class="sister" id="link2">Lacie<title>The Dormouse's story</title></a> and // <a href="http://example.com/tillie" class="sister" id="link3">Tillie<title>The Dormouse's story</title></a>; // and they lived at the bottom of a well. // </p>
// 清空內容 domCopy = dom.Clone() sel = domCopy.Find("p").Empty() fmt.Println(domCopy.Find("body").Html()) fmt.Println("=============") // <p class="title"></p> // <p class="story"></p> // <p class="story"></p>
domCopy = dom.Clone() sel = domCopy.Find("p").Remove() fmt.Println(domCopy.Html()) fmt.Println("=============") // <html><head><title>The Dormouse's story</title></head> // <body> // // </body></html>
domCopy = dom.Clone() sel = domCopy.Find("p").SetHtml("<b>test</b>") fmt.Println(domCopy.Find("body").Html()) fmt.Println("=============") // <p class="title"><b>test</b></p> // <p class="story"><b>test</b></p> // <p class="story"><b>test</b></p>
domCopy = dom.Clone() sel = domCopy.Find("a").ReplaceWithHtml("<p></p>") fmt.Println(domCopy.Find("body").Html()) fmt.Println("=============") // <p class="title"><b>The Dormouse's story</b></p> // <p class="story">Once upon a time there were three little sisters; and their names were // <p></p>, // <p></p> and // <p></p>; // and they lived at the bottom of a well. // </p>
domCopy = dom.Clone() sel = domCopy.Find("a").WrapHtml("<div></div>") fmt.Println(domCopy.Find("body").Html()) fmt.Println("=============") // <div><a href="http://example.com/elsie" class="sister" id="link1">Elsie</a></div>, // <div><a href="http://example.com/lacie" class="sister" id="link2">Lacie</a></div> and // <div><a href="http://example.com/tillie" class="sister" id="link3">Tillie</a></div>;
domCopy = dom.Clone() sel = domCopy.Find("a").WrapAllHtml("<div></div>") fmt.Println(domCopy.Find("body").Html()) fmt.Println("=============") // <p class="title"><b>The Dormouse's story</b></p> // <p class="story">Once upon a time there were three little sisters; and their names were // <div><a href="http://example.com/elsie" class="sister" id="link1">Elsie</a><a href="http://example.com/lacie" class="sister" id="link2">Lacie</a><a href="http://example.com/tillie" class="sister" id="link3">Tillie</a></div>, // and // ; // and they lived at the bottom of a well. // </p>
特殊方法
domCopy = dom.Clone() strList := domCopy.Find("a").Map(func(i int, s *goquery.Selection) string { str := s.AttrOr("href", "None") return str }) fmt.Println(strList) // [http://example.com/elsie http://example.com/lacie http://example.com/tillie]
// 以當前元件做判斷 sel = domCopy.Find("p") fmt.Println(sel.Is("b")) // false
// for loop sel := dom.Find(".selector") for i := range sel.Nodes { single := sel.Eq(i) // use `single` as a selection of 1 node }
完整原始碼
package main import ( "fmt" "log" "strings" "github.com/PuerkitoBio/goquery" "golang.org/x/net/html" ) func main() { html := ` <html> <head><title>The Dormouse's story</title></head> <body> <p class="title"><b>The Dormouse's story</b></p> <p class="story">Once upon a time there were three little sisters; and their names were <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>, <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>; and they lived at the bottom of a well. </p> <p class="story">...</p>` // Load the HTML document dom, err := goquery.NewDocumentFromReader(strings.NewReader(html)) if err != nil { log.Fatal(err) } var sel *goquery.Selection sel = dom.Find("a") prettyPrint(sel.Nodes) // "a" [{ href http://example.com/elsie} { class sister} { id link1}] // "a" [{ href http://example.com/lacie} { class sister} { id link2}] // "a" [{ href http://example.com/tillie} { class sister} { id link3}] sel = dom.Find("a.sister#link1") prettyPrint(sel.Nodes) // "a" [{ href http://example.com/elsie} { class sister} { id link1}] sel = dom.Find("p").Children() prettyPrint(sel.Nodes) // "b" [] // "a" [{ href http://example.com/elsie} { class sister} { id link1}] // "a" [{ href http://example.com/lacie} { class sister} { id link2}] // "a" [{ href http://example.com/tillie} { class sister} { id link3}] sel = dom.Find("p").ChildrenFiltered("#link1") prettyPrint(sel.Nodes) // "a" [{ href http://example.com/elsie} { class sister} { id link1}] sel = dom.Find("p.title").Siblings() prettyPrint(sel.Nodes) // "p" [{ class story}] // "p" [{ class story}] sel = dom.Find("a#link2").Siblings() prettyPrint(sel.Nodes) // "a" [{ href http://example.com/elsie} { class sister} { id link1}] // "a" [{ href http://example.com/tillie} { class sister} { id link3}] sel = dom.Find("a#link2").SiblingsFiltered("#link1") prettyPrint(sel.Nodes) // "a" [{ href http://example.com/elsie} { class sister} { id link1}] // 除 children 外,包含 text nodes sel = dom.Find("body").Contents() prettyPrint(sel.Nodes) // "\n " [] // "p" [{ class title}] // "\n " [] // "p" [{ class story}] // "\n " [] // "p" [{ class story}] // 含自己往上找,找到最接近的 parents sel = dom.Find("a").Closest("a") prettyPrint(sel.Nodes) // "a" [{ href http://example.com/elsie} { class sister} { id link1}] // "a" [{ href http://example.com/lacie} { class sister} { id link2}] // "a" [{ href http://example.com/tillie} { class sister} { id link3}] sel = dom.Find("a").Closest("p") prettyPrint(sel.Nodes) // "p" [{ class story}] // 找到其 parent,只往上查找一層,會自動移除重覆的 sel = dom.Find("a").Parent() prettyPrint(sel.Nodes) // "p" [{ class story}] sel = dom.Find("a").ParentFiltered("body") prettyPrint(sel.Nodes) // None // 找到其 parents,往上查找不停止,找出所有符合條件的,會自動移除重覆的 sel = dom.Find("a").Parents() prettyPrint(sel.Nodes) // "p" [{ class story}] // "body" [] // "html" [] sel = dom.Find("a").ParentsFiltered("body") prettyPrint(sel.Nodes) // "body" [] // 選擇第一個 sel = dom.Find("a").Eq(0) prettyPrint(sel.Nodes) // "a" [{ href http://example.com/elsie} { class sister} { id link1}] // 可為 string 也可以是 function sel = dom.Find("p").Filter(".story") prettyPrint(sel.Nodes) // "p" [{ class story}] // "p" [{ class story}] sel = dom.Find("p").FilterFunction(func(i int, s *goquery.Selection) bool { return s.Text() == "..." }) prettyPrint(sel.Nodes) // "p" [{ class story}] sel = dom.Find("a").Not("#link1") prettyPrint(sel.Nodes) // "a" [{ href http://example.com/lacie} { class sister} { id link2}] // "a" [{ href http://example.com/tillie} { class sister} { id link3}] sel = dom.Find("a#link2").Next() prettyPrint(sel.Nodes) // "a" [{ href http://example.com/tillie} { class sister} { id link3}] sel = dom.Find("a#link2").NextFiltered("a") prettyPrint(sel.Nodes) // "a" [{ href http://example.com/tillie} { class sister} { id link3}] sel = dom.Find("a#link2").Prev() prettyPrint(sel.Nodes) // "a" [{ href http://example.com/elsie} { class sister} { id link1}] sel = dom.Find("a#link2").PrevFiltered("a") prettyPrint(sel.Nodes) // "a" [{ href http://example.com/elsie} { class sister} { id link1}] sel = dom.Find("a#link1").NextAll() prettyPrint(sel.Nodes) // "a" [{ href http://example.com/lacie} { class sister} { id link2}] // "a" [{ href http://example.com/tillie} { class sister} { id link3}] sel = dom.Find("a#link1").NextAllFiltered("#link3") prettyPrint(sel.Nodes) // "a" [{ href http://example.com/tillie} { class sister} { id link3}] sel = dom.Find("a#link3").PrevAll() prettyPrint(sel.Nodes) // "a" [{ href http://example.com/lacie} { class sister} { id link2}] // "a" [{ href http://example.com/elsie} { class sister} { id link1}] sel = dom.Find("a#link3").PrevAllFiltered("#link1") prettyPrint(sel.Nodes) // "a" [{ href http://example.com/elsie} { class sister} { id link1}] // 回傳上一個 filter 結果 sel = dom.Find("a").Parent().End() // 等同 sel = dom.Find("a") prettyPrint(sel.Nodes) // "a" [{ href http://example.com/elsie} { class sister} { id link1}] // "a" [{ href http://example.com/lacie} { class sister} { id link2}] // "a" [{ href http://example.com/tillie} { class sister} { id link3}] // 會以第一個 <a> 為主 sel = dom.Find("a") fmt.Println(sel.Attr("id")) // link1 true fmt.Println(sel.AttrOr("noid", "nil")) // nil sel = dom.Find("a") fmt.Println(sel.Attr("class")) // sister true fmt.Println(sel.AttrOr("noclass", "nil")) // nil // 只要任何 elements 有就是 True sel = dom.Find("p") fmt.Println(sel.HasClass("story")) // true // 回傳所有元件的 text sel = dom.Find("title") fmt.Println(sel.Text()) // The Dormouse's story // 兩者意義一樣 sel = dom.Find("a") fmt.Println(sel.Length()) // 3 fmt.Println(sel.Size()) // 3 sel = dom.Find("head") fmt.Println(sel.Html()) //<title>The Dormouse's story</title> <nil> sel = dom.Find("head") fmt.Println(goquery.OuterHtml(sel)) // <head><title>The Dormouse's story</title></head> <nil> // # 複製原本的內容並回傳,可用在不想被更改的元件上 var domCopy *goquery.Selection domCopy = dom.Find(".title").Clone() // # 會將原本的 class 替換掉 domCopy = dom.Clone() sel = domCopy.Find("a").SetAttr("class", "classA") prettyPrint(sel.Nodes) // "a" [{ href http://example.com/elsie} { class classA} { id link1}] // "a" [{ href http://example.com/lacie} { class classA} { id link2}] // "a" [{ href http://example.com/tillie} { class classA} { id link3}] domCopy = dom.Clone() sel = domCopy.Find("a#link2").SetAttr("id", "link4") prettyPrint(domCopy.Find("a").Nodes) // "a" [{ href http://example.com/elsie} { class sister} { id link1}] // "a" [{ href http://example.com/lacie} { class sister} { id link4}] // "a" [{ href http://example.com/tillie} { class sister} { id link3}] // # 保留原本的 class domCopy = dom.Clone() sel = domCopy.Find("a").AddClass("classB") prettyPrint(sel.Nodes) // "a" [{ href http://example.com/elsie} { class sister classB} { id link1}] // "a" [{ href http://example.com/lacie} { class sister classB} { id link2}] // "a" [{ href http://example.com/tillie} { class sister classB} { id link3}] domCopy = dom.Clone() sel = domCopy.Find("p").RemoveClass("story") prettyPrint(sel.Nodes) // "p" [{ class title}] // "p" [] // "p" [] domCopy = dom.Clone() sel = domCopy.Find("a").ToggleClass("brother").ToggleClass("sister") prettyPrint(sel.Nodes) // "a" [{ href http://example.com/elsie} { class brother} { id link1}] // "a" [{ href http://example.com/lacie} { class brother} { id link2}] // "a" [{ href http://example.com/tillie} { class brother} { id link3}] domCopy = dom.Clone() sel = domCopy.Find("a").SetAttr("val", "123") prettyPrint(sel.Nodes) // "a" [{ href http://example.com/elsie} { class sister} { id link1} { val 123}] // "a" [{ href http://example.com/lacie} { class sister} { id link2} { val 123}] // "a" [{ href http://example.com/tillie} { class sister} { id link3} { val 123}] domCopy = dom.Clone() sel = domCopy.Find("a").RemoveAttr("class") prettyPrint(sel.Nodes) // "a" [{ href http://example.com/elsie} { id link1}] // "a" [{ href http://example.com/lacie} { id link2}] // "a" [{ href http://example.com/tillie} { id link3}] domCopy = dom.Clone() sel = domCopy.Find(".title").SetText("123") fmt.Println(goquery.OuterHtml(sel)) // # 原來的 <b> 被移除了 // <p class="title">123</p> <nil> domCopy = dom.Clone() sel = domCopy.Find(".title").BeforeHtml("<div>before</div>") fmt.Println(domCopy.Find("body").Html()) // <div>before</div><p class="title"><b>The Dormouse's story</b></p> domCopy = dom.Clone() sel = domCopy.Find(".title").AfterHtml("<div>after</div>") fmt.Println(domCopy.Find("body").Html()) // <p class="title"><b>The Dormouse's story</b></p><div>after</div> domCopy = dom.Clone() sel = domCopy.Find(".title").PrependHtml("<div>prepend</div>") fmt.Println(goquery.OuterHtml(sel)) // <p class="title"><div>prepend</div><b>The Dormouse's story</b></p> domCopy = dom.Clone() sel = domCopy.Find(".title").AppendHtml("<div>append</div>") fmt.Println(goquery.OuterHtml(sel)) // <p class="title"><b>The Dormouse's story</b><div>append</div></p> // 將 prepend 元件放到 find 所有元件裡面的前面,原本的 prepend 元件仍存在 domCopy = dom.Clone() sel = domCopy.Find("a").Prepend("title") fmt.Println(domCopy.Find("body").Html()) fmt.Println("=============") // <p class="title"><b>The Dormouse's story</b></p> // <p class="story">Once upon a time there were three little sisters; and their names were // <a href="http://example.com/elsie" class="sister" id="link1"><title>The Dormouse's story</title>Elsie</a>, // <a href="http://example.com/lacie" class="sister" id="link2"><title>The Dormouse's story</title>Lacie</a> and // <a href="http://example.com/tillie" class="sister" id="link3"><title>The Dormouse's story</title>Tillie</a>; // and they lived at the bottom of a well. // </p> //將 append 元件放到 find 所有元件裡面的後面,原本的 append 元件仍存在 domCopy = dom.Clone() sel = domCopy.Find("a").Append("title") fmt.Println(domCopy.Find("body").Html()) fmt.Println("=============") // <p class="title"><b>The Dormouse's story</b></p> // <p class="story">Once upon a time there were three little sisters; and their names were // <a href="http://example.com/elsie" class="sister" id="link1">Elsie<title>The Dormouse's story</title></a>, // <a href="http://example.com/lacie" class="sister" id="link2">Lacie<title>The Dormouse's story</title></a> and // <a href="http://example.com/tillie" class="sister" id="link3">Tillie<title>The Dormouse's story</title></a>; // and they lived at the bottom of a well. // </p> // 清空內容 domCopy = dom.Clone() sel = domCopy.Find("p").Empty() fmt.Println(domCopy.Find("body").Html()) fmt.Println("=============") // <p class="title"></p> // <p class="story"></p> // <p class="story"></p> domCopy = dom.Clone() sel = domCopy.Find("p").Remove() fmt.Println(domCopy.Html()) fmt.Println("=============") // <html><head><title>The Dormouse's story</title></head> // <body> // // </body></html> domCopy = dom.Clone() sel = domCopy.Find("p").SetHtml("<b>test</b>") fmt.Println(domCopy.Find("body").Html()) fmt.Println("=============") // <p class="title"><b>test</b></p> // <p class="story"><b>test</b></p> // <p class="story"><b>test</b></p> domCopy = dom.Clone() sel = domCopy.Find("a").ReplaceWithHtml("<p></p>") fmt.Println(domCopy.Find("body").Html()) fmt.Println("=============") // <p class="title"><b>The Dormouse's story</b></p> // <p class="story">Once upon a time there were three little sisters; and their names were // <p></p>, // <p></p> and // <p></p>; // and they lived at the bottom of a well. // </p> domCopy = dom.Clone() sel = domCopy.Find("a").WrapHtml("<div></div>") fmt.Println(domCopy.Find("body").Html()) fmt.Println("=============") // <div><a href="http://example.com/elsie" class="sister" id="link1">Elsie</a></div>, // <div><a href="http://example.com/lacie" class="sister" id="link2">Lacie</a></div> and // <div><a href="http://example.com/tillie" class="sister" id="link3">Tillie</a></div>; domCopy = dom.Clone() sel = domCopy.Find("a").WrapAllHtml("<div></div>") fmt.Println(domCopy.Find("body").Html()) fmt.Println("=============") // <p class="title"><b>The Dormouse's story</b></p> // <p class="story">Once upon a time there were three little sisters; and their names were // <div><a href="http://example.com/elsie" class="sister" id="link1">Elsie</a><a href="http://example.com/lacie" class="sister" id="link2">Lacie</a><a href="http://example.com/tillie" class="sister" id="link3">Tillie</a></div>, // and // ; // and they lived at the bottom of a well. // </p> domCopy = dom.Clone() strList := domCopy.Find("a").Map(func(i int, s *goquery.Selection) string { str := s.AttrOr("href", "None") return str }) fmt.Println(strList) // [http://example.com/elsie http://example.com/lacie http://example.com/tillie] // 以當前元件做判斷 sel = domCopy.Find("p") fmt.Println(sel.Is("b")) // false } func prettyPrint(nodes []*html.Node) { for _, n := range nodes { fmt.Printf("%#v %v\n", n.Data, n.Attr) } fmt.Println() fmt.Println("============") }
留言
張貼留言