• XPath 是一门在 XML 文档中查找信息的语言。XPath 用于在 XML 文档中通过元素和属性进行导航。
  • XPath 含有超过 100 个内建的函数。这些函数用于字符串值、数值、日期和时间比较、节点和 QName 处理、序列处理、逻辑值等等。
  • XPath 是 W3C 标准,XPath 于 1999 年 11 月 16 日 成为 W3C 标准。XPath 被设计为供 XSLT、XPointer 以及其他 XML 解析软件使用。
  • 在XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档节点(或称为根节点)。
  • XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。


1.选取节点
          常用的路径表达式:
 

表达式

描述

实例

 

nodename

选取nodename节点的所有子节点

xpath(‘//div’)

选取了div节点的所有子节点

/

从根节点选取

xpath(‘/div’)

从根节点上选取div节点

//

选取所有的当前节点,不考虑他们的位置

xpath(‘//div’)

选取所有的div节点

.

选取当前节点

xpath(‘./div’)

选取当前节点下的div节点

..

选取当前节点的父节点

xpath(‘..’)

回到上一个节点

@

选取属性

xpath(’//@calss’)

选取所有的class属性



2.谓词:

被嵌在方括号内,用来查找某个特定的节点或包含某个制定的值的节点

表达式

结果

xpath(‘/body/div[1]’)

选取body下的第一个div节点

xpath(‘/body/div[last()]’)

选取body下最后一个div节点

xpath(‘/body/div[last()-1]’)

选取body下倒数第二个div节点

xpath(‘/body/div[positon()<3]’)

选取body下前两个div节点

xpath(‘/body/div[@class]’)

选取body下带有class属性的div节点

xpath(‘/body/div[@class=”main”]’)

选取body下class属性为main的div节点

xpath(‘/body/div[price>35.00]’)

选取body下price元素值大于35的div节点



3.通配符:

Xpath通过通配符来选取未知的XML元素

表达式

结果

xpath(’/div/*’)

选取div下的所有子节点

xpath(‘/div[@*]’)

选取所有带属性的div节点


4.取多个路径:

使用“ | 运算符可以选取多个路径

表达式

结果

xpath(‘//div|//table’)

选取所有的div和table节点


5.Xpath轴:

轴可以定义相对于当前节点的节点集

轴名称

表达式

描述

ancestor

xpath(‘./ancestor::*’)

选取当前节点的所有先辈节点(父、祖父)

ancestor-or-self

xpath(‘./ancestor-or-self::*’)

选取当前节点的所有先辈节点以及节点本身

attribute

xpath(‘./attribute::*’)

选取当前节点的所有属性

child

xpath(‘./child::*’)

返回当前节点的所有子节点

descendant

xpath(‘./descendant::*’)

返回当前节点的所有后代节点(子节点、孙节点)

following

xpath(‘./following::*’)

选取文档中当前节点结束标签后的所有节点

following-sibling

xpath(‘./following-sibling::*’)

选取当前节点之后的兄弟节点

parent

xpath(‘./parent::*’)

选取当前节点的父节点

preceding

xpath(‘./preceding::*’)

选取文档中当前节点开始标签前的所有节点

preceding-sibling

xpath(‘./preceding-sibling::*’)

选取当前节点之前的兄弟节点

self

xpath(‘./self::*’)

选取当前节点


6.功能函数:

使用功能函数能够更好的进行模糊搜索

函数

用法

解释

starts-with

xpath(‘//div[starts-with(@id,”ma”)]‘)

选取id值以ma开头的div节点

contains

xpath(‘//div[contains(@id,”ma”)]‘)

选取id值包含ma的div节点

and

xpath(‘//div[contains(@id,”ma”) and contains(@id,”in”)]‘)

选取id值包含ma和in的div节点

text()

xpath(‘//div[contains(text(),”ma”)]‘)

选取节点文本包含ma的div节点,模糊匹配

text()

xpath('//div[text()="ma"]')

完全匹配
  • 例子,查找href所有包含_4$xmmc的a节点
  • driver.find_elements_by_xpath('//a[contains(@href, "_4$xmmc")]')


7.常用函数:
  1、精确定位
(1)contains(str1,str2)用来判断str1是否包含str2
例1://*[contains(@class,'c-summaryc-row ')]选择@class值中包含c-summary c-row的节点
例2://div[contains(.//text(),'价格')]选择text()中包含价格的div节点
(2)position()选择当前的第几个节点
例1://*[@class='result'][position()=1]选择@class='result'的第一个节点
例2://*[@class='result'][position()<=2]选择@class='result'的前两个节点
(3)last()选择当前的倒数第几个节点
例1://*[@class='result'][last()]选择@class='result'的最后一个节点
例2://*[@class='result'][last()-1]选择@class='result'的倒数第二个节点

(4)following-sibling 选取当前节点之后的所有同级节点
例1://div[@class='result']/following-sibling::div选择@class='result'的div节点后所有同级div节点找到多个节点时可通过position确定第几个如://div[@class='result']/following-sibling::div[position()=1]

(5)preceding-sibling 选取当前节点之前的所有同级节点
使用方法同following-sibling
2、过滤信息
(1)substring-before(str1,str2)用于返回字符串str1中位于第一个str2之前的部分
例子:substring-before(.//*[@class='c-more_link']/text(),'条')
返回.//*[@class='c-more_link']/text()中第一个'条'前面的部分,如果不存在'条',则返回空值
(2)substring-after(str1,str2)跟substring-before类似,返回字符串str1中位于第一个str2之后的部分
例1:substring-after(.//*[@class='c-more_link']/text(),'条')
返回.//*[@class='c-more_link']/text()中第一个’条’后面的部分,如果不存在'条',则返回空值
例2:substring-after(substring-before(.//*[@class='c-more_link']/text(),'新闻'),'条')
返回.//*[@class='c-more_link']/text()中第一个'新闻'前面与第一个'条'后面之间的部分
(3)normalize-space()
用来将一个字符串的头部和尾部的空白字符删除,如果字符串中间含有多个连续的空白字符,将用一个空格来代替
例子:normalize-space(.//*[contains(@class,'c-summaryc-row ')])
(4)translate(string,str1,str2)
假如string中的字符在str1中有出现,那么替换为str1对应str2的同一位置的字符,假如str2这个位置取不到字符则删除string的该字符
例子:translate('12:30','03','54')结果:'12:45'

3、拼接信息
(1)concat()函数用于串连多个字符串
例子:concat('http://baidu.com',.//*[@class='c-more_link']/@href)

 

同级元素案例


<body><div class="normal-page current-trans-query"><div><div class="app-content"><div class="venus-component-layout-item amount"><span class="venus-layout-item01-right"><div class="el-date-editor venus-date-picker-small   el-input el-input--prefix el-input--suffix el-date-editor--date"><!----><input class="el-input__inner" type="text" placeholder="选择日期" autocomplete="off"><span class="el-input__prefix"><i class="el-input__icon el-icon-date"></i><!----></span><span class="el-input__suffix"><span class="el-input__suffix-inner"><i class="el-input__icon"></i><!----><!----><!----><!----></span><!----></span><!----><!----></div><span class="pd11">至</span><div class="el-date-editor venus-date-picker-small  el-input el-input--prefix el-input--suffix el-date-editor--date"><!----><input class="el-input__inner" type="text" placeholder="选择日期" autocomplete="off"><span class="el-input__prefix"><i class="el-input__icon el-icon-date"></i><!----></span><span class="el-input__suffix"><span class="el-input__suffix-inner"><i class="el-input__icon"></i><!----><!----><!----><!----></span><!----></span><!----><!----></div><span class="radio-group"><label tabindex="0" class="el-radio" role="radio"><span class="el-radio__input"><span class="el-radio__inner"></span><input tabindex="-1" class="el-radio__original" aria-hidden="true" type="radio" value="-7"></span><span class="el-radio__label">7天<!----></span></label><label tabindex="0" class="el-radio" role="radio"><span class="el-radio__input"><span class="el-radio__inner"></span><input tabindex="-1" class="el-radio__original" aria-hidden="true" type="radio" value="-15"></span><span class="el-radio__label">15天<!----></span></label><label tabindex="0" class="el-radio" role="radio"><span class="el-radio__input"><span class="el-radio__inner"></span><input tabindex="-1" class="el-radio__original" aria-hidden="true" type="radio" value="-30"></span><span class="el-radio__label">30天<!----></span></label></span></span></div></div></div></div></body>
</html>

 

xpath('//span[text()="至"]/following-sibling::div/input[@placeholder="选择日期"]')

8.使用html进行xpath测试

text = """
<html class="v-scope" v-app="ibsapp"><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>用户登录 - 微众银行 - 企业版</title>
<link href="css/login.css" rel="stylesheet" type="text/css">
<link href="css/style.css" rel="stylesheet" type="text/css">
<link href="css/form.css" rel="stylesheet" type="text/css">
<link href="css/pic.css" rel="stylesheet" type="text/css">
<link href="css/httpBackend-backdrop.css" rel="stylesheet" type="text/css">
<style type="text/css">
@charset "UTF-8";

[v\:cloak],[v-cloak],[data-v-cloak],[x-v-cloak],.v-cloak,.x-v-cloak {
	display: none;
}

v\:form {
	display: block;
}
</style>
<script language="javascript" for="powerpass" event="EventReturn">
	//需要跳转到的位置
	_vTokenName.focus();
</script>

<!--  处理 密码控件 的Tab事件 -->
<script language="javascript" for="powerpass" event="EventTab">
	//需要跳转到的位置
	_vTokenName.focus();
</script>
<script language="javascript" for="loginpassold" event="EventTab">
	//需要跳转到的位置
	document.getElementById("loginpass").focus();
</script>
<script language="javascript" for="loginpassold" event="EventReturn">
	//需要跳转到的位置
	document.getElementById("loginpass").focus();
</script>

<script language="javascript" for="loginpass" event="EventTab">
	//需要跳转到的位置
	document.getElementById("loginpassrep").focus();
</script>
<script language="javascript" for="loginpass" event="EventReturn">
	//需要跳转到的位置
	document.getElementById("loginpassrep").focus();
</script>
<script language="javascript" for="powerpass" event="EventDegree(arg1)">
	var degree = "";
	if (arg1 == "W") {
		degree = "弱";
	} else if (arg1 == "M") {
		degree = "中";
	} else if (arg1 == "S") {
		degree = "强";
	}
	//将强弱度显示出来
	//document.getElementById("EEE").innerHTML = "密码强度:" + degree;
</script>

</head>
<body>
	<div class="cover_box" id="cover_box"></div>
	<!----------附加内容区结束---------->

	<div class="page_top_box">
		<div class="login_top">
			<div class="login_logo">
			   <img width="160" height="60" src="images/logo2.png">
			</div>
			<div class="login_top_link">
				<a href="https://mc.webank.com/cfeb-front/static/ocx/WeBankSecurityTools_v2.3.9.18.exe">国密控件Windows版</a>
				<a href="https://mc.webank.com/cfeb-front/static/ocx/PowerEnterWEBANK_v2.3.9.12.dmg">国密控件Mac版</a>
			    <a href="https://c.webank.com/cfeb-front/static/Ulogin.html">Ukey版入口地址</a>
			<!--	<a href="../static/demo/login.html?ts=20160614">功能演示</a>--><!--   <a href="#">网银助手下载</a> <a href="#">常见问题</a>-->
			</div>

		</div>
	</div>
	<div class="page_center_box v-scope" href="htmls/loginpre/Login/mod.html" history="true" v-viewport="main"><div class="viewport-wrapper v-scope"><div class="v-scope" v-init="startup();" v-controller="LoginCtrl">
	<div class="login_center">
		<a href="../static/deposit.html" v-show="depositInsuranceFlag"><img style="border: 0px currentColor; border-image: none; left: 0px; top: 440px; width: 105px; height: 70px; margin-top: -5%; position: absolute;" src="../static/images/depositpre.png"></a>
		<form name="LoginForm" class="v-invalid v-invalid-required v-dirty" novalidate="" v-submit="doLogin(1);">
			<div class="form_box_bg"></div>
			<div class="form_box" id="loginform" v-show="loginShow">
				<div class="login_tt">查询版用户登录</div>
				<div style="margin: auto auto 30px; width: 260px; border-bottom-color: rgb(208, 208, 208); border-bottom-width: 1px; border-bottom-style: solid;"></div>
				<div class="input_box input_bg1">
					<input name="UserId" title="企业用户名" class="login_ipt1 v-dirty v-valid v-valid-required" required="" type="text" placeholder="用户名" v-model="UserId">
				</div>
				<div class="input_box input_bg2">
					<div id="loginpassDiv" style="padding-top: 6px; margin-left: 15px;"><object width="175" height="27" id="powerpass" classid="clsid:CE8709BB-4D77-4495-B039-7045A093C9C1"><PARAM NAME="_Version" VALUE="65536"><PARAM NAME="_ExtentX" VALUE="4630"><PARAM NAME="_ExtentY" VALUE="714"><PARAM NAME="_StockProps" VALUE="0"><PARAM NAME="OleBackColor" VALUE="16777215"><PARAM NAME="OleTextColor" VALUE="16711680"><PARAM NAME="OleBorderColor" VALUE="12164479"><PARAM NAME="backColor" VALUE=""><PARAM NAME="maskChar" VALUE="*"><PARAM NAME="accepts" VALUE="[:graph:]+"><PARAM NAME="lang" VALUE="zh_CN"><PARAM NAME="maxLength" VALUE="16"><PARAM NAME="minLength" VALUE="6"><PARAM NAME="caption" VALUE="微众银行"><PARAM NAME="OleCaptionColor" VALUE="0"><PARAM NAME="captionColor" VALUE=""><PARAM NAME="captionFont" VALUE=""><PARAM NAME="captionSize" VALUE="0"><PARAM NAME="captionBold" VALUE="1"><PARAM NAME="softKeyboard" VALUE="-1"><PARAM NAME="softkbdPriority" VALUE="0"><PARAM NAME="softkbdRandom" VALUE="1"><PARAM NAME="softkbdType" VALUE="0"><PARAM NAME="contentType" VALUE="3"><PARAM NAME="X" VALUE="5"><PARAM NAME="Y" VALUE="0"><PARAM NAME="adjustTime" VALUE="1"><param name="width" value="175"><param name="height" value="27"><param name="maxLength" value="16"><param name="minLength" value="6"><param name="maskChar" value="*"><param name="backColor" value="#FFFFFF"><param name="textColor" value="#0000FF"><param name="caption" value="微众银行"><param name="borderColor" value="#7F9DB9"><param name="accepts" value="[:graph:]+"><param name="contentType" value="3"><param name="softKeyboard" value="true"><param name="softKbdType" value="0"></object></div>
				</div>
				<div class="input_box input_bg3">
					<input name="_vTokenName" title="验证码" class="login_ipt2 v-pristine v-invalid v-invalid-required v-valid-style" required="" type="text" maxlength="4" placeholder="验证码" v-model="_vTokenName" style-message="请输入4位随机码" v-val=":style/^[a-zA-Z0-9]{4}$/">
					<div class="login_yzm">
						<img name="_tokenImg" title="点击刷新" id="_tokenImg" style="margin: 5px 0px 5px auto;" src="/eweb/GenTokenImg.do?random=0.781063757137772&amp;UserId=undefined" v-src="/eweb/GenTokenImg.do?random=0.781063757137772&amp;UserId=undefined" v-click="reloadTokenImg()">
					</div>
				</div>
				<div class="btn_box1">
					<input class="login_btn1" type="submit" value="登      录" v-disabled="loginInvalidFlag"> <span id="loadimg" style="left: 55px; top: 5px; display: none; position: absolute; z-index: 1000;">
						<img width="16" height="16" src="images/loading1.gif">
					</span>
				</div>
				<div style="color: red; display: none;" v-show="jsonError">
					<i class="icon-info-sign"></i><span class="v-binding" v-bind="jsonError.jsonErrorMsg">null</span>
				</div>
			</div>
			<div class="form_box" id="alertform" style="display: none;" v-show="alertShow">
			   <div class="login_tt">查询版用户登录</div>
			   <div style="margin: auto auto 10px; width: 260px; border-bottom-color: rgb(208, 208, 208); border-bottom-width: 1px; border-bottom-style: solid;"></div>
			   <div class="alert_box"><b>抱歉,您当前的浏览器不支持登录.</b></div>
			   <div class="alert_tt"><b>建议更换如下浏览器:</b></div>
			   <div class="alert_tt">IE8、9、10、11浏览器</div>
			   <div class="alert_tt">最新版QQ/Safari浏览器</div>
			   <div class="alert_tt">Chrome浏览器41及41以前的版本</div>
			   <div style="text-align: center; margin-top: 20px;"><img width="100" height="100" src="images/unsupport.png"></div>
			</div>
		</form>
		<!-- <div class="mobel"></div> -->
		<!-- <div class="example1">
			<ul>
				<li><img src="images/pic/001.png?ts=20160614" alt="1" /></li>
				<li><img src="images/pic/002.png?ts=20160614" alt="2" /></li>
				<li><img src="images/pic/001.png?ts=20160614" alt="3" /></li>
				<li><img src="images/pic/002.png?ts=20160614" alt="4" /></li>
			</ul>
			<ol>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
			</ol>
		</div> -->
		<!--Luara图片切换骨架end-->
	</div>
</div>

<script src="htmls/loginpre/Login/mod.js?_=1634193376789" type="text/javascript"></script></div></div>
	
	<div class="page_bottom_box">
		<!-- <div class="cpe_box"></div> -->
		<div class="copyright_box">
			Copyright © 2014-2020 Webank. All Rights Reserved.
				深圳前海微众银行股份有限公司 &nbsp;
				客服电话:400-999-8877<br>本网站支持IPV6<br>
		</div>
		<!-- <div class="zs_box"></div> -->
	</div>
	<!-- 遮罩开始 -->
		<div class="httpBackend-backdrop" id="load_back_drop" style="display: none;">
			<div class="httpBackend-container " id="load_progress">
				<div class="progress progress-striped active">
					<div class="bar">L o a d i n g...</div>
				</div>
			</div>
		</div>
		<!-- 遮罩结束 -->
		<!-- 签名控件 -->
	<span id="powersignDiv" style="width: 1px; height: 1px; margin-top: 20px;"><object width="1" height="1" id="powersign" classid="clsid:B9AF313D-724E-4D24-80F3-A7461D82B519" data="data:application/x-oleobject;base64,PTGvuU5yJE2A86dGHYK1GQAIAAAaAAAAGgAAAA==" style="width: 1px; height: 1px;"></object></span>
	<script src="js/writeObject.js?timestamp=201707281414" type="text/javascript"></script><object width="1" height="1" id="versionObj" classid="clsid:385CDE75-EBCC-4FD6-AD2E-0B4B87962981"><PARAM NAME="_Version" VALUE="65536"><PARAM NAME="_ExtentX" VALUE="26"><PARAM NAME="_ExtentY" VALUE="26"><PARAM NAME="_StockProps" VALUE="0"><PARAM NAME="adjustTime" VALUE="1"><param name="width" value="1"><param name="height" value="1"><param name="maxLength" value="16"><param name="minLength" value="6"><param name="maskChar" value="*"><param name="backColor" value="#FFFFFF"><param name="textColor" value="#0000FF"><param name="caption" value="微众银行"><param name="borderColor" value="#7F9DB9"><param name="accepts" value="[:alnum:]+"><param name="contentType" value="3"><param name="softKeyboard" value="true"></object>
	<script src="lib/jquery-1.10.2.js?timestamp=201707281414" type="text/javascript"></script>
	<script src="lib/vx.min.js" type="text/javascript"></script>
	<script src="lib/vx-plugin.js" type="text/javascript"></script>
	<script src="lib/vx-config.js" type="text/javascript"></script>
	<script src="lib/vx-locale_zh_cn.js" type="text/javascript"></script>
	<script src="lib/login/vx-ui.login.dev.js" type="text/javascript"></script><script src="lib/plugins/jquery.luara.0.0.1.min.js" type="text/javascript"></script><script src="lib/ui.js" type="text/javascript"></script><script src="lib/modules/directives/ui-tooltip.js" type="text/javascript"></script><script src="lib/modules/directives/ui-progress.js" type="text/javascript"></script><script src="lib/modules/directives/ui-button.js" type="text/javascript"></script><script src="lib/modules/directives/ui-keyallow.js" type="text/javascript"></script>
	<script src="lib/main/vx-ui.main.dev.js" type="text/javascript"></script><script src="lib/plugins/artDialog/artDialog.js" type="text/javascript"></script><script src="lib/plugins/jquery.select.js" type="text/javascript"></script><script src="lib/ui.js" type="text/javascript"></script><script src="lib/common.js" type="text/javascript"></script><script src="lib/modules/directives/ui-progress.js" type="text/javascript"></script><script src="lib/modules/directives/ui-slidebox.js" type="text/javascript"></script><script src="lib/modules/directives/ui-validate.js" type="text/javascript"></script><script src="lib/modules/directives/ui-menu.js" type="text/javascript"></script><script src="lib/modules/directives/ui-calendar.js" type="text/javascript"></script><script src="lib/modules/directives/ui-tooltip.js" type="text/javascript"></script><script src="lib/modules/directives/ui-check.js" type="text/javascript"></script><script src="lib/modules/directives/ui-button.js" type="text/javascript"></script><script src="lib/modules/directives/ui-pager.js" type="text/javascript"></script><script src="lib/modules/directives/ui-goto.js" type="text/javascript"></script><script src="lib/modules/directives/ui-goLast.js" type="text/javascript"></script><script src="lib/modules/directives/placeholder.js" type="text/javascript"></script><script src="lib/modules/directives/ui-select2.js" type="text/javascript"></script><script src="lib/modules/directives/ui-editable.js" type="text/javascript"></script><script src="lib/modules/directives/ui-keyallow.js" type="text/javascript"></script><script src="lib/modules/services/artDialogService.js" type="text/javascript"></script><script src="lib/modules/services/popupService.js" type="text/javascript"></script><script src="lib/modules/services/transService.js" type="text/javascript"></script><script src="lib/modules/services/signService.js" type="text/javascript"></script><script src="lib/modules/services/alertService.js" type="text/javascript"></script><script src="lib/modules/services/fileService.js" type="text/javascript"></script><script src="lib/modules/services/printService.js" type="text/javascript"></script><script src="lib/modules/services/dateValidService.js" type="text/javascript"></script><script src="lib/modules/filters/dateStrFilter.js" type="text/javascript"></script><script src="lib/modules/filters/amountFilter.js" type="text/javascript"></script><script src="lib/modules/filters/accountNoFilter.js" type="text/javascript"></script><script src="lib/modules/filters/encryptAcNoFilter.js" type="text/javascript"></script><script src="lib/modules/filters/skipFilter.js" type="text/javascript"></script><script src="lib/modules/filters/rateFilter.js" type="text/javascript"></script><script src="lib/modules/filters/exprConditionFilter.js" type="text/javascript"></script><script src="lib/modules/filters/formatterFilter.js" type="text/javascript"></script><script src="lib/modules/filters/toIntFilter.js" type="text/javascript"></script>

<div style="display: none; position: absolute;"><div class="aui_outer"><table class="aui_border"><tbody><tr><td class="aui_nw"></td><td class="aui_n"></td><td class="aui_ne"></td></tr><tr><td class="aui_w"></td><td class="aui_c"><div class="aui_inner"><table class="aui_dialog"><tbody><tr><td class="aui_header" colspan="2"><div class="aui_titleBar"><div class="aui_title" style="cursor: move;"></div><a class="aui_close" href="javascript:/*artDialog*/;">×</a></div></td></tr><tr><td class="aui_icon" style="display: none;"><div class="aui_iconBg" style="background: none;"></div></td><td class="aui_main" style="width: auto; height: auto;"><div class="aui_content" style="padding: 20px 25px;"></div></td></tr><tr><td class="aui_footer" colspan="2"><div class="aui_buttons" style="display: none;"></div></td></tr></tbody></table></div></td><td class="aui_e"></td></tr><tr><td class="aui_sw"></td><td class="aui_s"></td><td class="aui_se" style="cursor: se-resize;"></td></tr></tbody></table></div></div></body></html>
"""
from lxml import etree

html = etree.HTML(text)
# result = etree.tostring(html,encoding="utf-8",pretty_print=True,method="html")
# print(result.decode('utf-8'))

li_result = html.xpath("//input[@value='登      录']")
print(li_result)