爬虫-XPath
- #下载这个库 pip install lxml
-
准备学习资料(用xpath匹配标签中的元素)
- <header class="header">
- <a href="https://www.i4.cn/" title="爱思助手" class="logo"><img src="https://d-image.i4.cn/i4web/static2017/img/head_logo.png" width="164" height="46" alt="爱思助手"/></a>
- <nav>
- <a href="https://www.i4.cn/" title="首页" id="nav_index">首页</a>
- <a href="https://www.i4.cn/pros.html" title="产品中心" id="nav_pros">产品中心</a>
- <a href="https://www.i4.cn/firmware.html" title="固件" id="nav_ipsw">固件</a>
- <a href="https://www.i4.cn/app_3_1_1_0_1.html" title="资源" id="nav_res">资源</a>
- <a href="https://www.i4.cn/news_3.html" title="教程" id="nav_tutorial">教程</a>
- <a href="https://www.i4.cn/news_1.html" title="新闻" id="nav_article">新闻</a>
- <a href="https://developer.i4.cn" target="_blank" title="开发者平台">开发者平台</a>
- </nav>
- <div class="search">
- <form method="get" action="https://www.i4.cn/index_search.action">
- <div class="selectdown" name="search_select">
- <div class="arrows"></div>
- <div class="title">教程</div>
- <div class="options">
- <div class="list" data-value="3">教程</div>
- <div class="list" data-value="4">资讯</div>
- <div class="list" data-value="1">应用</div>
- </div>
- <input type="hidden" name="type" value="3" />
- </div>
- <input type="hidden" name="model" value="1" />
- <input type="text" name="k" id="textfield">
- <a href="javascript:;" title="搜索">搜索</a>
- </form>
- </div>
- </header>
-
使用xpath读取变量中的文本
- from lxml import etree --导入模块
- data = etree.HTML(上面的文本或者是一个网页源码) --得到一个html对象(自动补全HTML标签)
-
- data_1 = etree.tostring(data,encoding='utf-8') --字节编码方式得到一个HTML的原文,有中文的话需要encoding解码
-
- data_2 = data_1.decode('utf-8') --对字节串中文解码,再次进行输入就是网页源代码
-
使用xpath读取本地html文本文件
- from lxml import etree --导入模块
- data = etree.parse('./练习.html', etree.HTMLParser()) -- 读取本地文件(自动补全标签)
-
- data = etree.tostring(data, encoding='utf-8') --读取文件,指定编码
-
- data = data.decode() --对字节串进行解码
-
使用xpath进行匹配标签
- from lxml improt etree
- data = 上面的练习资料 --仿爬虫获得的html响应
-
- html = data.HTML(data) --得到html对象,自带有xpath语法
-
- content = html.xpath('//a')
- #通过表达式('//a')得到一文件中的所有a标签(当前文件中有9个a标签),返回一个html对象列表
-
- restal = etree.tostring(a_html[0],pretty_print=True,method="html",encoding='utf-8')
- #解码为utf8形式
-
-
- 表达式实例:
- ('//nav/a') -- 表示查询nav节点下的所有a标签
-
-
- ('//nav/a/@target') --表示查询@target属性的值
- html = etree.HTML(HTML)
- a_html = html.xpath('//nav/a/@target')
- print(a_html[0])
- #输出:_blank
-
-
- ('//nav/a[@target="_blank"]') --表示根据target属性等于_blank作为条件查询
- html = etree.HTML(HTML)
- a_html = html.xpath('//nav/a[@target="_blank"]')
- restal = etree.tostring(a_html[0],pretty_print=True,method="html",encoding='utf-8')
- print(restal.decode())
- #输出: <a href="https://developer.i4.cn" target="_blank" title="开发者平台">开发者平台</a>
-
-
- ('//nav/a/..') --选取a标签的父级标签
- #输出为:所有nav的标签
-
-
- ('//nav/a[7]') --选取a标签中下标为7的元素
-
-
- ('//nav/a[7]/text()') --选取nav下的第7个a标签中的文本数据
- html = etree.HTML(HTML)
- a_html = html.xpath('//nav/a[7]/text()')
- print(a_html)
- #输出:['开发者平台']
-
-
- ('//nav/a/text()') --获取nav中所有a标签的所有文本数据
-
-
- ('//nav/a[7]/@title') --获取nav下的a标签中第7个tittle属性
- #输出:['开发者平台']
-
-
- ('//nav/a[@title="新闻" or @title="教程"]') --获取title属性为新闻或者教程的标签
- html = etree.HTML(HTML)
- a_html = html.xpath('//nav/a[@title="新闻" or @title="教程"]')
- restal = etree.tostring(a_html[1],pretty_print=True,method="html",encoding='utf-8')
- print(restal)
- #输出:<a href="https://www.i4.cn/news_1.html" title="新闻" id="nav_article">新闻</a>
-
-
- ('//nav/a[@title="新闻" or @title="教程"]/text()') --同上获取标签中的文本
-
-
- ('//nav/a[last()]') --获取nav标签中a标签的最后一个标签
-
-
- ('//nav/a[last() - 1]') --获取nav标签中a标签的最后一个标签的前一个标签
-
-
- ('//nav/a[position() < 3]') --获取nav中的a标签前两个元素
- html = etree.HTML(HTML)
- a_html = html.xpath('//nav/a[position() < 3]')
- for i in range(0,len(a_html)):
- restal = etree.tostring(a_html[i],pretty_print=True,method="html",encoding='utf-8')
- print(restal.decode())
-
xpath语法
- nodename -- 选取此节点的所有子节点
- / -- 从当前节点选取直接子节点
- // -- 从当前节点选取子孙节点
- . -- 选取当前节点
- .. -- 选取当前节点的父节点
- @ -- 选取属性
-