本文主要通过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)



感谢分享: