commit | b89597bb364b42ec218a23c1b38640ce9f27eb36 | [log] [tgz] |
---|---|---|
author | Martin Angers <martin.n.angers@gmail.com> | Fri Nov 07 17:33:22 2014 |
committer | Martin Angers <martin.n.angers@gmail.com> | Fri Nov 07 17:33:22 2014 |
tree | c43671b6e34182ef8852cb6639dc33cf15db5174 | |
parent | fb2312a925258bc69c0998103640733e65b75d1d [diff] |
doc
goquery brings a syntax and a set of features similar to jQuery to the Go language. It is based on Go‘s net/html package and the CSS Selector library cascadia. Since the net/html parser returns nodes, and not a full-featured DOM tree, jQuery’s stateful manipulation functions (like height(), css(), detach()) have been left off.
Also, because the net/html parser requires UTF-8 encoding, so does goquery: it is the caller's responsibility to ensure that the source document provides UTF-8 encoded HTML. See the wiki for various options to do this.
Syntax-wise, it is as close as possible to jQuery, with the same function names when possible, and that warm and fuzzy chainable interface. jQuery being the ultra-popular library that it is, I felt that writing a similar HTML-manipulating library was better to follow its API than to start anew (in the same spirit as Go's fmt
package), even though some of its methods are less than intuitive (looking at you, index()...).
Please note that because of the net/html dependency, goquery requires Go1.1+.
$ go get github.com/PuerkitoBio/goquery
(optional) To run unit tests:
$ cd $GOPATH/src/github.com/PuerkitoBio/goquery $ go test
(optional) To run benchmarks (warning: it runs for a few minutes):
$ cd $GOPATH/src/github.com/PuerkitoBio/goquery $ go test -bench=".*"
Note that goquery's API is now stable, and will not break.
*Matcher
functions, that receive compiled cascadia selectors instead of selector strings, thus avoiding potential panics thrown by goquery via cascadia.MustCompile
calls. This results in better performance (selectors can be compiled once and reused) and better error handling (you can handle cascadia's compilation errors). Note that the actual type expected is a Matcher
interface, that cascadia.Selector
implements. Other matcher implementations could be used.html.Node
s.NewDocumentFromReader()
(thanks jweir) which allows creating a goquery document from an io.Reader.NewDocumentFromResponse()
(thanks assassingj) which allows creating a goquery document from an http response.EachWithBreak()
which allows to break out of an Each()
loop by returning false. This function was added instead of changing the existing Each()
to avoid breaking compatibility.Document.Root
is removed, Document
is now a Selection
itself (a selection of one, the root element, just like Document.Root
was before). Add jQuery's Closest() method.goquery exposes two structs, Document
and Selection
, and the Matcher
interface. Unlike jQuery, which is loaded as part of a DOM document, and thus acts on its containing document, goquery doesn‘t know which HTML document to act upon. So it needs to be told, and that’s what the Document
type is for. It holds the root document node as the initial Selection value to manipulate.
jQuery often has many variants for the same function (no argument, a selector string argument, a jQuery object argument, a DOM element argument, ...). Instead of exposing the same features in goquery as a single method with variadic empty interface arguments, statically-typed signatures are used following this naming convention:
Prev()
), and the version with a selector string argument is called XxxFiltered()
(e.g.: PrevFiltered()
)Is()
)XxxSelection()
and take a *Selection
object as argument (e.g.: FilterSelection()
)XxxNodes()
and take a variadic argument of type *html.Node
(e.g.: FilterNodes()
)XxxFunction()
and take a function as argument (e.g.: FilterFunction()
)Matcher
interface and are defined as XxxMatcher()
(e.g.: IsMatcher()
)The complete godoc reference documentation can be found here.
Please note that Cascadia's selectors do not necessarily match all supported selectors of jQuery (Sizzle). See the cascadia project for details.
See some tips and tricks in the wiki.
Taken (and adapted as if executed from outside the goquery package) from example_test.go:
package main import ( "fmt" "log" "github.com/PuerkitoBio/goquery" ) func ExampleScrape() { doc, err := goquery.NewDocument("http://metalsucks.net") if err != nil { log.Fatal(err) } doc.Find(".reviews-wrap article .review-rhs").Each(func(i int, s *goquery.Selection) { band := s.Find("h3").Text() title := s.Find("i").Text() fmt.Printf("Review %d: %s - %s\n", i, band, title) }) } func main() { ExampleScrape() }
The BSD 3-Clause license, the same as the Go language. Cascadia's license is here.