本文主要通过golang来介绍针对html的parse和修正
1,有可能单纯的爬并不能满足需求
2,有可能单纯的爬格式或者内容不能自定义
这里笔者通过一个case来进行介绍
第三方库:
可以通过get url 或者read local file 来读取html文件
这里笔者有个需求,就是去除email中的签名
经过观察发现,签名都是body最后一个div。这样目前就明确来,就是parse html之后去除最后一个div。所以,
1,这里我们用到Remove() 这个函数
就是Find() 指定的内容,然后在老的基础上移除,生成新的html
2,这里我们还用到一个知识点,就是如何定位到最后一个div。
这里我们用 div:last-child 来定义最后一个div节点
html := `<html>xxxx</html>`
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)
感谢分享: