xpath的作用就是兩個字“定位”,運用各種方法進行快速准確的定位,推薦兩個非常有用的的firefox工具:firebug和xpath checker
定位
1.依靠自己屬性,文本定位
//td[text()='xxx']
//div[contains(@class,'xxx')]
//div[@class='xxx' and @type='xxx']
2.依靠父節點定位
//div[@class='xxx']/div
//div[@id='xxx']/div
3.依靠子節點定位
//div[div[@id='xxx']]
//div[div[@name='xxx']]
4.混合型
//div[div[@name='xxx']]/img
//td[a/font[contains(text(),'xxx')]]//input[@type='xxx']
xpath的學習-拓展
1.following-sibling
following-sibling即為“選擇當前節點之后的所有同級節點”,那么沒有加上“sibling”關鍵字的,搜索的就是之上/之下的所有節點,忽略同級概念,例如:
<div>
<input id="123">
<input>
</div>
要定位第二個input://input[@id='123']/following-sibling::input
2.preceding-sibling
preceding-sibling的解釋是“選取當前節點之前的所有同級節點”,那么沒有加上“sibling”關鍵字的,搜索的就是之上/之下的所有節點,忽略同級概念,
preceding-sibling和following-sibling是剛好相反的
<div>
<span>text</span>
<input id="123">
</div>
要定位第二個input://input[@id='123']/preceding-sibling::span
3.contains
和字面意思一樣就是包含,例如://div[contains(@class,'xxx')]
4.starts-with
和字面意思一樣就是以某某開頭,例如://input[starts-with(@class,'xxx')]
5.not
就是否定的意思
比如找一個id不為123的input:input[not[id='123']]
又如找一個文本中不包含xxx字段的span://span[not(contains(text(),'xxx'))]
xpath的學習-補充
絕對路徑 html/body/div/span[2]/input[2] 中間結構變化,就失效
相對路徑 //開始,在整個html source里找,不管在什么位置
索引[x] //div/input[2] div下面第二個input
position()=2position()>3position()<3
例如html:<div id="positions">
<input>
<span>test position()1</span>
<span>test position()2</span>
<span>test position()3</span>
<span>test position()4</span>
<span>test position()5</span>
</input>
</div>
獲取第一個span,可以是//div[@id='positions']/span[1],也可以是//div[@id='positions']/span[position()=1]
//div[@id='positions']/span[position()>3]就是定位了test position()4和test position()5
//div[@id='positions']/span[position()<3]就是定位了test position()1和test position()2
last()last()-1
以上面的html為例子,獲取最后一個span://div[@id='positions']/span[last()]
以上面的html為例子,獲取倒數第二個span://div[@id='positions']/span[last()-1]
屬性定位@class //div[@class] 有class屬性的div
屬性值定位,前面已經講過了 //div[@class='xxx']
功能關鍵字
1.常用
and/[][],比如://span[@name='xxx' and text()='xxx']也是可以寫成//span[@name='xxx'][text()='xxx']
or,比如以上面html為例子,定位文本為test position()5和test position()4的span
://div[@id='positions']/span[text()='test position()5' or text()='test position()4']
not,contains,starts-with
ends-with 在xpath中是沒有這個的
2.不常用的
substring,substring-before,substing-after
sbustring(str,start-position,length) 比如html:
<div id="xxx">
<span name="?-xxxxx-09">text</span>
</div>
定位上面html中span://div[@id='xxx']/span[substring(@name,3,5)='xxxxx']
substring-before的用法,比如html
<div id="xxx">
<span class="spanclass1-789">text</span>
</div>
定位上面html中span://div[@id="xxx"]/span[sbustring-before(@class,"-")="spanclass1"]
substring-after的用法,比如html
<div id="xxx">
<span class="789-spanclass2">text</span>
</div>
定位上面html中span://div[@id="xxx"]/span[sbustring-after(@class,"-")="spanclass22"]
通配符 *
比如//span[@*="xxx"]指定位span中任意屬性包含xxx的
比如//*[@*="xxx"]指定位頁面中任意屬性保護xxx的標簽
Axes 軸
parent 父節點
ancestor 祖先節點,包括父節點,一層一層向上
descendant 所有子孫節點找,不管什么位置,簡寫//,就是xpath中出現//的情況。。//div[@class="xxx"]//input
follwing-sibling 當前元素后面的兄弟姐妹
preceding-sibling 當前元素前面的兄弟姐妹
following 當前元素后面所有元素,一直到</html>
preceding 當前元素之前所有元素,一直到<html>
ancestor-or-self
descendant-or-self
使用的時候注意加上::