Golang通过pup实现HTML解析
Bryce · · 4082 次点击 · · 开始浏览上一周给我的网站加了一个搜索功能,能自动抓取我的博客和别人的CSDN博客。通过RSS抓取。这样数据格式规范,容易解析。问题是信息较少。后来发现在HTML源代码里面,会有为了方便搜索引擎索引的meta字段,能指出作者和详情。以我的博客《Golang实现HTTP发送gzip请求》为例。里面的meta信息如下:
<meta charset="utf-8">
<meta name="description" content="beego的httplib不支持发送gzip请求,自己研究了一下。">
<meta name="author" content="Bryce">
<meta name="google-translate-customization" content="a4136e955b3e09f2-45a74b56dc13e741-gf616ffda6e6360e0-11">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
查了查,一般大家通过xpath进行解析。有一个现成的包https://github.com/go-xmlpath/xmlpath,按照说明做了一下,不行。看了一下源码,这个包内部是通过encoding/xml实现的,如果HTML的代码有问题,标签不是严格按照规范编写的,就会有解析问题。同理,如果把HTML当作XHTML处理,也是不行的。
后来发现一个神奇的工具https://github.com/EricChiang/pup,通过命令go get github.com/ericchiang/pup安装。它可以通过管道调用:
curl -s http://blog.cyeam.com | pup 'div div div div h2 a'
直接抓取作者和简介可以用如下命令:
curl -s http://blog.cyeam.com/golang/2014/11/29/golang_gzip/ | pup 'head meta[name="author"] attr{content}'
curl -s http://blog.cyeam.com/golang/2014/11/29/golang_gzip/ | pup 'head meta[name="description"] attr{content}'
这个包能完美解决我的问题,进去看了一下源码,发现包名是main,再一个是因为它用来解析HTML不是那么方便,想了想,我囧的还是用cmd的方式通过管道执行。
req := httplib.Get("http://blog.cyeam.com/golang/2014/11/29/golang_gzip/")
res, err := req.Bytes()
if err != nil {
panic(err)
}
cmd := exec.Command("pup", `head meta`)
stdin, err := cmd.StdinPipe()
if err != nil {
panic(err)
}
// defer stdin.Close()
var output bytes.Buffer
cmd.Stdout = &output
if err = cmd.Start(); err != nil { //Use start, not run
fmt.Println("An error occured: ", err) //replace with logger, or anything you want
}
stdin.Write(res)
stdin.Close()
if err := cmd.Wait(); err != nil {
panic(err)
}
fmt.Println(string(output.Bytes())) //for debug
通过shell命令行管道是通过|实现,而通过Golang代码,需要通过exec包提供的Stdin实现。把内容写入标准输入流,就相当于管道输入了。写完了要关闭输入流stdin.Close(),如果不关闭,输入流不会被写入。。。
本文所涉及到的完整源码请参考。
######参考文献 + 【1】Package exec - The Go Programming Language + 【2】golang讲解(go语言)标准库分析之os/exec - widuu
原文链接:Golang通过pup实现HTML解析,转载请注明来源!
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
上一周给我的网站加了一个搜索功能,能自动抓取我的博客和别人的CSDN博客。通过RSS抓取。这样数据格式规范,容易解析。问题是信息较少。后来发现在HTML源代码里面,会有为了方便搜索引擎索引的meta字段,能指出作者和详情。以我的博客《Golang实现HTTP发送gzip请求》为例。里面的meta信息如下:
<meta charset="utf-8">
<meta name="description" content="beego的httplib不支持发送gzip请求,自己研究了一下。">
<meta name="author" content="Bryce">
<meta name="google-translate-customization" content="a4136e955b3e09f2-45a74b56dc13e741-gf616ffda6e6360e0-11">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
查了查,一般大家通过xpath进行解析。有一个现成的包https://github.com/go-xmlpath/xmlpath,按照说明做了一下,不行。看了一下源码,这个包内部是通过encoding/xml实现的,如果HTML的代码有问题,标签不是严格按照规范编写的,就会有解析问题。同理,如果把HTML当作XHTML处理,也是不行的。
后来发现一个神奇的工具https://github.com/EricChiang/pup,通过命令go get github.com/ericchiang/pup安装。它可以通过管道调用:
curl -s http://blog.cyeam.com | pup 'div div div div h2 a'
直接抓取作者和简介可以用如下命令:
curl -s http://blog.cyeam.com/golang/2014/11/29/golang_gzip/ | pup 'head meta[name="author"] attr{content}'
curl -s http://blog.cyeam.com/golang/2014/11/29/golang_gzip/ | pup 'head meta[name="description"] attr{content}'
这个包能完美解决我的问题,进去看了一下源码,发现包名是main,再一个是因为它用来解析HTML不是那么方便,想了想,我囧的还是用cmd的方式通过管道执行。
req := httplib.Get("http://blog.cyeam.com/golang/2014/11/29/golang_gzip/")
res, err := req.Bytes()
if err != nil {
panic(err)
}
cmd := exec.Command("pup", `head meta`)
stdin, err := cmd.StdinPipe()
if err != nil {
panic(err)
}
// defer stdin.Close()
var output bytes.Buffer
cmd.Stdout = &output
if err = cmd.Start(); err != nil { //Use start, not run
fmt.Println("An error occured: ", err) //replace with logger, or anything you want
}
stdin.Write(res)
stdin.Close()
if err := cmd.Wait(); err != nil {
panic(err)
}
fmt.Println(string(output.Bytes())) //for debug
通过shell命令行管道是通过|实现,而通过Golang代码,需要通过exec包提供的Stdin实现。把内容写入标准输入流,就相当于管道输入了。写完了要关闭输入流stdin.Close(),如果不关闭,输入流不会被写入。。。
本文所涉及到的完整源码请参考。
######参考文献 + 【1】Package exec - The Go Programming Language + 【2】golang讲解(go语言)标准库分析之os/exec - widuu
原文链接:Golang通过pup实现HTML解析,转载请注明来源!