這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
使用Go做爬蟲首先想到了XPath解析來做於是上網搜在github上找到了一個Go寫的Xpath的庫貌似是官方維護的
官方地址: http://gopkg.in/xmlpath.v1
xmlpath.v1 中只有三個結構體
Node 代表當前解析出來的節點 並且該節點是被處理過的可以被Path訪問的
Path 代表指定的尋找路徑
Iter Node的集合
這麼講很不清楚還是上代碼講解吧
package mainimport ("fmt""os"xmlpath "gopkg.in/xmlpath.v1")func main() {//nodename()//getFieldValue()getSpecifiedValue()}var file *os.Filevar node *xmlpath.Nodefunc init() {var err errorfile, err = os.OpenFile("t.xml", os.O_RDWR, os.ModePerm)if err != nil {panic("openFile failed!!!")}//解析檔案獲得經過處理的並且可以被path訪問的Node類型的nodenode, err = xmlpath.Parse(file)if err != nil {panic("xmlpath parse file failed!!!")}}func nodename() {//bookstore為根節點編譯過後得到一個*Path類型的值path := xmlpath.MustCompile("bookstore")//可能會有多本書所以使用path.Iter(node)擷取該節點下面的node集合也就是iteratorit := path.Iter(node)//判斷是否有下一個for it.Next() {//如果有把當前的Node節點取出 並列印出值fmt.Println(it.Node().String())}}func getFieldValue() {//選取全文中屬性包含@lang的節點 而不管他的位置path := xmlpath.MustCompile("//@lang")it := path.Iter(node)for it.Next() {fmt.Println(it.Node().String())}//選取全文中屬性包含lang並且值為en的節點 而不管他的位置path = xmlpath.MustCompile("//*[@lang=\"en\"]")it = path.Iter(node)for it.Next() {fmt.Println(it.Node().String())}}func getSpecifiedValue() {//選取Bookstore中的第二本書的title節點path := xmlpath.MustCompile("/bookstore/book[2]/title")fmt.Println(path.String(node))}
以上為簡單的樣本 想要深入可以看w3c關於xpath的教程