xpath语法
- 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属性 |
被嵌在方括号内,用来查找某个特定的节点或包含某个制定的值的节点
表达式 |
结果 |
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节点 |
Xpath通过通配符来选取未知的XML元素
表达式 |
结果 |
xpath(’/div/*’) |
选取div下的所有子节点 |
xpath(‘/div[@*]’) |
选取所有带属性的div节点 |
使用“ | 运算符可以选取多个路径
表达式 |
结果 |
xpath(‘//div|//table’) |
选取所有的div和table节点 |
轴可以定义相对于当前节点的节点集
轴名称 |
表达式 |
描述 |
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::*’) |
选取当前节点 |
使用功能函数能够更好的进行模糊搜索
函数 |
用法 |
解释 |
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)
同级元素案例
|
xpath('//span[text()="至"]/following-sibling::div/input[@placeholder="选择日期"]') |
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&UserId=undefined" v-src="/eweb/GenTokenImg.do?random=0.781063757137772&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.
深圳前海微众银行股份有限公司
客服电话: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)
本文作者: 永生
本文链接: https://yys.zone/detail/?id=214
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
发表评论
评论列表 (0 条评论)
暂无评论,快来抢沙发吧!