爬虫内容过滤的主要步骤:先用css选择器,go的选择器 golang.org/x/net/html
,再用表达式对所选内容,再做一个过滤。本文针对主要技术点做说明。
目录
- 获取页面编码
- css选择器
- 正则表达式
- Parser解析器
获得页面编码
- net/html安装
//go get golang.org/x/net/html
- 示例
//r的参数为response.Body
func determinEncoding(r io.Reader) encoding.Encoding{
bytes,err := bufio.NewReader(r).Peek(1024)
if err != nil {
panic(err)
}
encoding,_,_ := charset.DetermineEncoding(bytes,"")
return encoding
}
func main(){
resp,err := http.Get(...)
if err!=nil{
panic(err)
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
fmt.Println("Error: status code",resp.StatusCode)
}
//编码
e := determinEncoding(resp.Body)
//按编码转换爬虫而来的数据,依赖golang.org/x/text
utf8Reader :=
transform.NewReader(resp.Body,e.NewDecoder())
...
}
goquery之css选择器介绍
- 介绍
Goquery,是 github 上 PuerkitoBio 开源的 Go 语言库,代码仓库在https://github.com/PuerkitoBio/goquery
。
goquery 使用 Go 语言实现了与 jQuery 尽可能相似的查询和操作语法,包括 CSS 选择语法和绝大部分的操作函数,方便熟悉 jQuery 的 Go 语言开发人员快速完成 HTML 文档的解析和查询操作。
jQuery 的 $(...) 语法来查询和操作 DOM 元素。
- 安装
go get github.com/PuerkitoBio/goquery
- 使用
doc,err :=goquery.NewDocumentFromReader(utf8Reader)
if err != nil{
panic(err)
}
doc.Find("dl.city-list>dd").Each(
func(i int, sel *goquery.Selection) {
content,_ := sel.Html()
if err == nil{
fmt.Println(content)
}
})
正则表达式
package main
import (
"fmt"
"regexp"
)
const text = `My email is ccmouse@gmail.com@abc
email is : test1@sina.com
email is : abc@github.org
email is : nianxl@dd.com.cn
`
func main() {
//提取邮件
re := regexp.MustCompile(`[a-zA-Z0-9]+@[a-zA-Z0-9]+.[a-zA-Z0-9]+[.][a-zA-Z0-9]+`)
val := re.FindAllString(text,-1) //-1代表全部
fmt.Printf("邮件列表为:%s \n",val)
//提到邮件后半部分的域名:需要加分组
re1 := regexp.MustCompile(`([a-zA-Z0-9]+)@([a-zA-Z0-9]+.[a-zA-Z0-9]+[.][a-zA-Z0-9]+)`)
domainVal := re1.FindAllStringSubmatch(text,-1)
fmt.Print("\n提取的域名列表为:")
for i,_ := range domainVal{
fmt.Printf("%s ",domainVal[i][2])
}
}
网友评论