您当前的位置:首页 > 计算机 > 编程开发 > Python

爬虫-XPath

时间:08-16来源:作者:点击数:

爬虫-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        -- 选取此节点的所有子节点
/               -- 从当前节点选取直接子节点
//              -- 从当前节点选取子孙节点
.               -- 选取当前节点
..              -- 选取当前节点的父节点
@               -- 选取属性
在这里插入图片描述
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐