Go-XPath解析

u012807459 · · 7952 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

使用Go做爬虫首先想到了XPath解析来做于是上网搜在github上找到了一个Go写的Xpath的库貌似是官方维护的

官方地址: http://gopkg.in/xmlpath.v1

   xmlpath.v1 中只有三个结构体

Node 代表当前解析出来的节点 并且该节点是被处理过的可以被Path访问的

Path 代表指定的寻找路径

Iter Node的集合

这么讲很不清楚还是上代码讲解吧

package main

import (
	"fmt"
	"os"
	xmlpath "gopkg.in/xmlpath.v1"
)

func main() {
//	nodename()
//	getFieldValue()
	getSpecifiedValue()
}

var file *os.File
var node *xmlpath.Node

func init() {
	var err error
	file, err = os.OpenFile("t.xml", os.O_RDWR, os.ModePerm)
	if err != nil {
		panic("openFile failed!!!")
	}
	//解析文件获得经过处理的并且可以被path访问的Node类型的node
	node, err = xmlpath.Parse(file)
	if err != nil {
		panic("xmlpath parse file failed!!!")
	}
}

func nodename() {
	//bookstore为根节点编译过后得到一个*Path类型的值
	path := xmlpath.MustCompile("bookstore")
	//可能会有多本书所以使用path.Iter(node)获取该节点下面的node集合也就是iterator
	it := 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的教程




有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:u012807459

查看原文:Go-XPath解析

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:701969077

7952 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传