一、xpath介绍
xpath是XML路径语言,它可以用来确定xml文档中的元素位置,通过元素路径来完成对元素的查找。HTML就是XML的一种实现方式,所以xpath是一种非常强大的定位方式。
1、公式://标签名称[@属性='属性的值']
//*[@id="kw"] ---相对路径
/html/body/div[1]/div[2]/div[5]/div[1]/div/form/span[1]/input --绝对路径
表达式 | 说明 |
/ | 绝对定位,从根节点选取 |
// | 相对定位,从匹配选择的当前节点选择文档中的节点,而不考虑他们的位置,稳定性高,更简洁 |
. | 选取当前节点 |
.. | 选取当前节点的父节点 |
@ | 选取属性,@class='xxx'或@id='xxx'或@name='xxx',属性放在中括号中[] |
* | 通配符。匹配所有 //* |
@* | 通配符。匹配所有属性 //*[@*='WORD'] |
二、xpath定位方式扩展
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
#依据id属性通过xpath表达式定位输入框
driver.find_element("xpath","//input[@id='kw']")
#依据class属性通过xpath表达式定位输入框
driver.find_element("xpath","//input[@class='s_ipt']")
#依据name属性通过xpath表达式定位输入框
driver.find_element("xpath","//input[@name='wd']")
#通过xpath进行组合定位百度超文本链接
driver.find_element("xpath","//a[@target='_blank'][@href='http://news.baidu.com']")
driver.find_element("xpath","//a[@target='_blank' and @href='http://news.baidu.com']")
#依据text文本通过xpath定位百度超文本链接
driver.find_element("xpath","//a[text()='地图']")
#通过contians()定位已知的部分属性值
driver.find_element("xpath","//a[contains(text(),'闻')]")
#通过索引去获取,括号的作用:提高运算优先级
driver.find_element("xpath","(//input)[1]")
# 通过父亲去找儿子 //div/span/input /---表示目录的层级
driver.find_element("xpath","//span[@id='s_kw_wrap']/input[@id='kw']")
#通过祖先去找后代
driver.find_element("xpath","//form[@id='form']//input[@id='kw']")
#通过儿子去找父亲
driver.find_element("xpath","//input[@id='kw']/..")
#其他方法都不行的时候,这个时候就用到轴运算,最终绝招
#找哥哥姐姐
driver.find_element("xpath","//input[@id='kw']/preceding-sibling::span")
#找弟弟妹妹
driver.find_element("xpath","//input[@id='kw']/following-sibling::span")
# 找祖先
driver.find_element("xpath","//input[@id='kw']/ancestor::span")
三、元素定位的优缺点(上篇文章未讲到,此处补充下)
1、id和name:
1、优点:易于定位元素,大多数时其属性值是唯一的,web页面的同一个页面当中,id是唯一的
2、缺点:很多元素没有id和name属性
2、class_name和tag_name:
1、优点:几乎所有的元素都有class_name和tag_name
2、缺点:class和tag的值往往不是唯一,很难精准的找到一个元素
3、link_text和partial_link_text:
1、特点:只能用于<a>标签
2、区别:
1、link_text:用于一些<a>标签名字比较短的
2、partial_link_text:用于一些<a>标签名字很长,我们可以选取一部分特殊的词去定位
4、xpath和css_selector:
1、特点:xpath和css_selector几乎可以用于所有的页面元素定位,都可以直接生成。但是有的时候直接生成的也不是100%管用,有些情况还是需要手工去写xpath和css_selector
2、可以采用任意属性来定位元素,只需要在属性的两边加一对中括号即可