【Golang实战】——XPath解析网页
引言
之前用Python写过一个解析网页的脚本,最近开始研究golang,所以准备用golang将其重构,但是这个脚本中使用了到了python中的xpath库,所以研究了下,golang也有对应的库,这个库比我们使用正则从网页中获取我们需要的内容更简单些。
实例
我们以解析网页中的ip+端口为例:网站:https://www.kuaidaili.com/free/inha
1、引入包
github.com/antchfx/htmlquery v1.2.5
2、获得网页内容
func getHtml(url_ string) string {req, _ := http.NewRequest("GET", url_, nil)req.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3776.0 Safari/537.36")client := &http.Client{Timeout: time.Second * 5}resp, err := client.Do(req)if err != nil {log.Fatalln(err)}defer resp.Body.Close()data, err := ioutil.ReadAll(resp.Body)if err != nil && data == nil {log.Fatalln(err)}return fmt.Sprintf("%s", data)
}
3、解析内容
func main() {
urlTemplate := "https://www.kuaidaili.com/free/inha/%d/"for i := 1; i < 4000; i++ {var proxies []stringhtml := getHtml(fmt.Sprintf(urlTemplate, i))root, _ := htmlquery.Parse(strings.NewReader(html))tr := htmlquery.Find(root, "//*[@id='list']/table/tbody/tr")for _, row := range tr {item := htmlquery.Find(row, "./td")ip := htmlquery.InnerText(item[0])port := htmlquery.InnerText(item[1])//type_ := htmlquery.InnerText(item[3])p := ip + ":" + portproxies = append(proxies, p)}}
}
通过上面代码我们就可以从页面中将我们需要的ip+port内容获取到,我们可以根据这种格式解析我们自己想要的网页内容。
4、xpath语法
XPath 语法 | 菜鸟教程
5、其它是实现
golang中多个包来实现xpath,我们再看下libxml2
包引入
go get github.com/lestrrat-go/libxml2
解析内容
<ol class="grid_view"><li><div class="item"><div class="info"><div class="hd"><a href="https://movie.douban.com/subject/1292052/" class=""><span class="title">肖申克的救赎</span><span class="title"> / The Shawshank Redemption</span><span class="other"> / 月黑高飞(港) / 刺激 1995(台)</span></a><span class="playable">[可播放]</span></div></div></div></li>....
</ol>
golang代码
func parseUrls(url string, ch chan bool) {doc := fetch(url)defer doc.Free()nodes := xpath.NodeList(doc.Find(`//ol[@class="grid_view"]/li//div[@class="hd"]`))for _, node := range nodes {urls, _ := node.Find("./a/@href")titles, _ := node.Find(`.//span[@class="title"]/text()`)log.Println(strings.Split(urls.NodeList()[0].TextContent(), "/")[4],titles.NodeList()[0].TextContent())}time.Sleep(2 * time.Second)ch <- true
}
这种方式比第一种方式使用起来麻烦一些,并且接口和文档都不是非常的完善。
【Golang实战】——XPath解析网页相关推荐
- python通过xpath解析网页爬取高清大图和王者荣耀英雄海报
python通过xpath解析网页 xpath XPath,全称 XML Path Language,即 XML 路径语言,它是一门在 XML 文档中查找信息的语言.最初是用来搜寻 XML 文档的,但 ...
- 用xpath解析网页
作者:金良(golden1314521@gmail.com) csdn博客:http://blog.csdn.net/u012176591 lxml手册:http://lxml.de/index.ht ...
- 使用xpath解析网页的实例(完整代码)
本文以解析搜狗网页为例,使用xpath方法解析出来它的十个搜锁热词,代码简洁通俗易懂,非常适合初学者入门.完整代码如下: #导入相关库 import requests from lxml import ...
- Python3使用Xpath解析网易云音乐歌手页面
Xpath最初被设计用来搜寻XML文档,但它同样适用于HTML文档的搜索.通过简洁明了的路径选择表达式,它提供了强大的选择功能:同时得益于其内置的丰富的函数,它可以匹配和处理字符串.数值.时间等数据格 ...
- Python爬虫(入门+进阶)学习笔记 1-4 使用Xpath解析豆瓣短评
本节课程主要介绍解析神器Xpath是什么.Xpath如何安装及使用,以及使用实际的例子讲解Xpath如何解析豆瓣短评的网页并获取数据. 解析神器Xpath Xpath的使用 实战环节 解析神器Xpat ...
- 6、通过xpath获取网页数据
1.xpath解析网页源文件 from urllib import request from lxml import etree # 请求的url url = "http://www.dfe ...
- python爬取微博评论(通过xpath解析的方式)
前段时间笔者写了一份儿爬取微博评论的代码,是用了http://m.weibo.cn的接口,通过这个接口比较好的是代码比较好写,因为数据都是json格式的,规律性非常直观,属性json数据和字典操作的朋 ...
- Python爬虫实战之xpath解析
XPath 是一门在 XML 文档中查找信息的语言,最初是用来搜寻 XML 文档的,但是它同样适用于 HTML 文档的搜索. 所以在Python爬虫中,我们经常使用xpath解析这种高效便捷的方式来提 ...
- scrapy无法使用xpath解析?特殊网页的信息提取(1) — 百度贴吧
scrapy无法使用xpath解析?特殊网页的信息提取(1) - 百度贴吧 1. 背景 最近在使用scrapy爬取百度贴吧帖子内容时,发现用xpath无法解析到页面元素.但是利用xpath helpe ...
最新文章
- DeepMind推出分布式深度强化学习架构IMPALA,让一个Agent学会多种技能
- 皮一皮:高考考了 692 分想当程序员的女生
- anaconda应答文件
- 假如,只是假如把支付宝存储服务器炸了,里面的钱还在么?
- MySQL索引面试题:优化 索引分类
- 链表应用——多项式相加
- 移远EC600低功耗唤醒锁wakelock的使用,QuecPython功耗分析
- python教程(八)之异常(8.Warn)
- datawhale8月组队学习《pandas数据处理与分析》(下)(文本、分类、时序数据)
- test 4:假币问题
- 面试重点:starter原理以及自己动手实现一个starter
- Android,保存图片并通知系统更新相册
- Centos7.6上安装水族馆遇到报错BEGIN failed--compilation aborted at /usr/local/bin/asciiquarium line 42.
- 《“己学”发略》发略
- 微信小程序期末大作业 记单词小程序 适合初学者学习使用
- 一个简单的字幕滚动程序~~
- java实现网上招标系统
- HTML5期末大作业:个人空间相册网页设计 (6页) HTML+CSS+JavaScript
- AutoCAD如何快速标注零件序号
- 软考初级程序员--学习
热门文章
- 美国五名议员因新冠病毒“自我隔离”,至少两人曾与特朗普“接触”
- SVN服务器详解之用户权限配置——authz文件
- 基于 RISC-V SoC 的可配置 FFT 系统设计(2)RISC-V 的起源及其发展历程
- Apple Watch教程|如何取消配对并抹掉 Apple Watch?
- 阿里云人脸识别C#调用示例参考
- 【论文笔记】Deep Reinforcement Learning Control of Hand-Eye Coordination with a Software Retina
- Kubernetes基础:MacOS上设定Dashboard
- 论如何打开.md文件
- 51CTO学院 c++视频
- 关键词指数是什么意思?