go语言解析html
转载地址: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相关推荐
- python手册中文版apk-Go、Python 语言解析安卓 APK 包
Go语言解析APK Github上有一个非常棒的Go语言的库 https://github.com/shogo82148/androidbinary 虽然Star数量有点少,不过代码质量高的惊人.维护 ...
- mysql解释器_atitit.java解析sql语言解析器解释器的实现
atitit.java解析sql语言解析器解释器的实现 1. 解析sql的本质:实现一个4gl dsl编程语言的编译器 1 2. 解析sql的主要的流程,词法分析,而后进行语法分析,语义分析,构建sq ...
- python自动解析json_Python语言解析JSON详解
本文主要向大家介绍了Python语言解析JSON详解,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. JSON 函数使用 JSON 函数需要导入 json 库:import jso ...
- 论文浅尝 - EMNLP2020 | 通过词重排序跨语言解析
笔记整理 | 吴林娟,天津大学硕士 来源:EMNLP2020 链接:https://www.aclweb.org/anthology/2020.findings-emnlp.265.pdf 动机 依赖 ...
- C语言解析动态html,【c语言】使用gumbo解析HTML
之前使用过PHP的Simple HTML DOM简单地解析HTML但PHP终非我所熟悉的语言,虽然我并不对语言抱有绝对的执着= =(什么你不相信,好吧,不管你信不信,反正我是信了= =).虽然可以简单 ...
- get请求可以传body吗_详解用 Go 语言解析各种 HTTP 请求的方法
之前这个系列的文章一直在讲用 Go 语言怎么编写HTTP服务器来提供服务,如何给服务器配置路由来匹配请求到对应的处理程序,如何添加中间件把一些通用的处理任务从具体的Handler中解耦出来,以及如何更 ...
- Python语言解析xml文件
python语言解析xml文件的常用的有两种方式: 通过MiniDom库解析xml文件 通过ElementTree库解析xml文件 MiniDom方式解析xml xml文件以data.xml为例,具体 ...
- c语言解析sql语句_解析SQL语句比解析类C语言更麻烦?
最近想做一个SQL语句解析器,换句话说想给自己的系统加上类似SQL语句的查询引擎.我之前做过一个解析类似C语言语法的解析器,可以解析 C/C++里的运算表达式,if-else-等基本语句.我以为做个S ...
- 使用c语言解析gprmc数据
好的,我可以为您解释如何使用 C 语言解析 GPRMC 数据. GPRMC (Global Positioning System Receiver Monitoring Control) 是 GPS ...
- 易语言解析网页内容替换换行符问题
易语言解析网页内容替换换行符,直接用字符数来替换 分割文本 (局_结果, 字符 (10), )
最新文章
- 极品:蓝丽网 - Vml图像画板.2003 web上的PhotoShop
- CV00-03-CV基本操作2
- 将字符串所有长度为5的字串输出在屏幕上
- redis分布式锁实现思路
- 未捕获ReferenceError:未定义$?
- 【工具篇】接口测试神器 -- Postman 入门教程
- weblogic管理2 - 创建并启动一个managed server
- JDK6笔记(3)----正则表达式
- 和SAP Sales Organization相关的一些有用函数
- oauth2和jwt_OAuth2,JWT,Open-ID Connect和其他令人困惑的事物
- 4 error C2220: 警告被视为错误 - 没有生成“object”文件 (..\..\src\caffe\util\math_functions.cpp)
- oracle 区管理系统,oracle区管理和段空间管理详细介绍
- Linux : top命令
- 机器学习基石笔记-Lecture 14 Regularization
- WIN10杜比音效驱动安装[蓝奏云]
- 智方8000系房地产进销存管理系统 v4.30 官网
- MAC 配置svn比较工具diffmerge
- 2022软件项目管理案例教程期末考知识点汇总(期末复习用)
- wps比对两列数据重复_“两个wps表格,怎么比对重复的数据?“两个表格对照核对...
- uni-app上自定义微信小程序的tabbar