转载地址:https://studygolang.com/articles/4602

有两个不错的库:

https://github.com/PuerkitoBio/goquery

一个是

http://code.google.com/p/go.net/html

html是html的解析器,把html文本解析出来,goquery基于html包,在此基础上结合cascadia 包(一个css选择器工具),实现类似于jquery的功能,操作html非常方便。

使用goquery来查找,选择相应的html节点,但如果要对选择的节点进行修改,删除操作,还需要深入使用html包。

html包把html文本解析为一个树,这个树有很多Node组成,操作的核心就在于对Node的操作。

用几个例子来说明一下吧:

doc, err := goquery.NewDocument("http://sports.sina.com.cn")

生成一个goquery的doc。

goquery用的最多的是Find函数,类似于jquery的$(),可以选择dom结构。

例1:

dhead := doc.Find("head")dcharset := dhead.Find("meta[http-equiv]")charset, _ := dcharset.Attr("content")

这个例子用来找出页面的charset。

例2:

logo := doc.Find("#retina_logo")

这个是根据html中的id来选择dom

例3:

bread := doc.Find("div.blkBreadcrumbLink")

选择doc中class为blkBreadcrumbLink的div

例4:

var faceImg string
var innerImg = []string{}dom_body.Find("div.img_wrapper").Each(func(i int, s *goquery.Selection) {imgpath, exists := s.Find("img").Attr("src")if !exists {return}if i == 0 {faceImg = imgpath}innerImg = append(innerImg, imgpath)})

找出所有class为img_wrapper的div,然后在每个div下搜索img,获取img的src

例5:

dom_node := doc.Find("[bosszone='ztTopic']").Find("a")

这个是根据属性/值来查找相应的元素

如果要对html进行编辑操作,需要使用html.Node,这里提供一个清洗div的代码,使用了递归:

func clear_dom(pn *html.Node, isgb2312 bool) error {var err errorfor nd := pn.FirstChild; nd != nil; {switch nd.Type {case html.ElementNode:tn := strings.ToLower(nd.Data)//fmt.Printf("element node: %s\n", tn)if tn == "script" || tn == "style" {// delete the elementtmp := ndnd = tmp.NextSiblingpn.RemoveChild(tmp)} else if tn == "a" {tmp := ndnd = nd.NextSiblingif err = convert_dom(tmp, isgb2312); err != nil {return err}} else if tn == "span" {tmp := ndnd = nd.NextSiblingclear_dom(tmp, isgb2312)} else {tmp := ndnd = nd.NextSiblingif err = convert_dom(tmp, isgb2312); err != nil {return err}}case html.CommentNode:tmp := ndnd = tmp.NextSiblingpn.RemoveChild(tmp)case html.TextNode:tmp := ndnd = nd.NextSiblingif err = convert_dom(tmp, isgb2312); err != nil {return err}default:nd = nd.NextSibling}}return nil
}

其中conver_dom是对node节点的text进行转码操作,如果不需要,可以忽略。

func Nodehtml(n *html.Node) string {var buf = bytes.NewBuffer([]byte{})html.Render(buf, n)return buf.String()
}func Nodetext(node *html.Node) string {if node.Type == html.TextNode {// Keep newlines and spaces, like jQueryreturn node.Data} else if node.FirstChild != nil {var buf bytes.Bufferfor c := node.FirstChild; c != nil; c = c.NextSibling {buf.WriteString(Nodetext(c))}return buf.String()}return ""
}

上面的两个函数,分别获取节点的html代码和text代码。html代码和text代码的区别是,html代码是原封不动的html代码,text代码仅仅显示html代码的内容,例如一段html: 例子,它的text代码是”例子”

go语言解析html相关推荐

  1. python手册中文版apk-Go、Python 语言解析安卓 APK 包

    Go语言解析APK Github上有一个非常棒的Go语言的库 https://github.com/shogo82148/androidbinary 虽然Star数量有点少,不过代码质量高的惊人.维护 ...

  2. mysql解释器_atitit.java解析sql语言解析器解释器的实现

    atitit.java解析sql语言解析器解释器的实现 1. 解析sql的本质:实现一个4gl dsl编程语言的编译器 1 2. 解析sql的主要的流程,词法分析,而后进行语法分析,语义分析,构建sq ...

  3. python自动解析json_Python语言解析JSON详解

    本文主要向大家介绍了Python语言解析JSON详解,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. JSON 函数使用 JSON 函数需要导入 json 库:import jso ...

  4. 论文浅尝 - EMNLP2020 | 通过词重排序跨语言解析

    笔记整理 | 吴林娟,天津大学硕士 来源:EMNLP2020 链接:https://www.aclweb.org/anthology/2020.findings-emnlp.265.pdf 动机 依赖 ...

  5. C语言解析动态html,【c语言】使用gumbo解析HTML

    之前使用过PHP的Simple HTML DOM简单地解析HTML但PHP终非我所熟悉的语言,虽然我并不对语言抱有绝对的执着= =(什么你不相信,好吧,不管你信不信,反正我是信了= =).虽然可以简单 ...

  6. get请求可以传body吗_详解用 Go 语言解析各种 HTTP 请求的方法

    之前这个系列的文章一直在讲用 Go 语言怎么编写HTTP服务器来提供服务,如何给服务器配置路由来匹配请求到对应的处理程序,如何添加中间件把一些通用的处理任务从具体的Handler中解耦出来,以及如何更 ...

  7. Python语言解析xml文件

    python语言解析xml文件的常用的有两种方式: 通过MiniDom库解析xml文件 通过ElementTree库解析xml文件 MiniDom方式解析xml xml文件以data.xml为例,具体 ...

  8. c语言解析sql语句_解析SQL语句比解析类C语言更麻烦?

    最近想做一个SQL语句解析器,换句话说想给自己的系统加上类似SQL语句的查询引擎.我之前做过一个解析类似C语言语法的解析器,可以解析 C/C++里的运算表达式,if-else-等基本语句.我以为做个S ...

  9. 使用c语言解析gprmc数据

    好的,我可以为您解释如何使用 C 语言解析 GPRMC 数据. GPRMC (Global Positioning System Receiver Monitoring Control) 是 GPS ...

  10. 易语言解析网页内容替换换行符问题

    易语言解析网页内容替换换行符,直接用字符数来替换 分割文本 (局_结果, 字符 (10), )

最新文章

  1. 极品:蓝丽网 - Vml图像画板.2003 web上的PhotoShop
  2. CV00-03-CV基本操作2
  3. 将字符串所有长度为5的字串输出在屏幕上
  4. redis分布式锁实现思路
  5. 未捕获ReferenceError:未定义$?
  6. 【工具篇】接口测试神器 -- Postman 入门教程
  7. weblogic管理2 - 创建并启动一个managed server
  8. JDK6笔记(3)----正则表达式
  9. 和SAP Sales Organization相关的一些有用函数
  10. oauth2和jwt_OAuth2,JWT,Open-ID Connect和其他令人困惑的事物
  11. 4 error C2220: 警告被视为错误 - 没有生成“object”文件 (..\..\src\caffe\util\math_functions.cpp)
  12. oracle 区管理系统,oracle区管理和段空间管理详细介绍
  13. Linux : top命令
  14. 机器学习基石笔记-Lecture 14 Regularization
  15. WIN10杜比音效驱动安装[蓝奏云]
  16. 智方8000系房地产进销存管理系统 v4.30 官网
  17. MAC 配置svn比较工具diffmerge
  18. 2022软件项目管理案例教程期末考知识点汇总(期末复习用)
  19. wps比对两列数据重复_“两个wps表格,怎么比对重复的数据?“两个表格对照核对...
  20. uni-app上自定义微信小程序的tabbar

热门文章

  1. Linux shell脚本调试
  2. java高效获取大文件的行数
  3. 怎么用class覆盖style样式
  4. Array.prototype.slice.call 将伪数组转成真数组的原理是什么?
  5. putty xshell远程连接Linux及密钥认证
  6. VMware ESX 5.0 网卡负载均衡配置3种方法
  7. iOS 权限判断 跳转对应设置界面
  8. LeetCode (73): Set Matrix Zeroes
  9. 关于location.href几种用法的区别
  10. git多人合作时,恢复误删文件