爬虫-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 -- 选取此节点的所有子节点
/ -- 从当前节点选取直接子节点
// -- 从当前节点选取子孙节点
. -- 选取当前节点
.. -- 选取当前节点的父节点
@ -- 选取属性