golang 爬虫 mysql_golang 爬虫

本文主要通过golang来介绍针对html的parse和修正

1,有可能单纯的爬并不能满足需求

2,有可能单纯的爬格式或者内容不能自定义

这里笔者通过一个case来进行介绍

第三方库:PuerkitoBio/goquery​github.combb159344bb8b461742171f432fec0751.png

可以通过get url 或者read local file 来读取html文件

这里笔者有个需求,就是去除email中的签名

经过观察发现,签名都是body最后一个div。这样目前就明确来,就是parse html之后去除最后一个div。所以,

1,这里我们用到Remove() 这个函数

就是Find() 指定的内容,然后在老的基础上移除,生成新的html

2,这里我们还用到一个知识点,就是如何定位到最后一个div。

这里我们用 div:last-child 来定义最后一个div节点

html := `xxxx`

doc, err := goquery.NewDocumentFromReader(strings.NewReader(html))

if err != nil {

log.Fatal(err)

}

doc.Find("div:last-child").Each(func(_ int, s *goquery.Selection) {

s.Remove()

})

html1, _ := doc.Html()

fmt.Println(html1)

遇到的问题:

1,在去邮件签名的时候:由于每封邮件的格式不一致,导致,会出现,把整个邮件过滤,或者过滤失败,所以根据去除最后一个div这个条件的时候,在加一个判断,判断是否存在同级的div,如果存在,则去除最后一个,如果不存在,则往该div下一层的元素进行查看

这里查看div是否为多个的方式为:

div := doc.Find("body > div").Nodes

divLen := len(div)

如果divLen如果为1,说名body下就只有一个div元素,则

doc.Find("div div").Find("div div").Find("div:last-child").Each(func(_ int, s *goquery.Selection) {

s.Remove()

})

否则就直接:

doc.Find("div:last-child").Each(func(_ int, s *goquery.Selection) {

s.Remove()

})

最后

htmlnoSign, err := doc.Html()

if err != nil {

return

}

ioutil.WriteFile("email.nosign.html", []byte(htmlnoSign), 0644)

感谢分享:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值