Xpath选择器
1、Xpath语法简介
前面我们学习了CSS选择元素。
大家可以发现非常灵活、强大。
还有一种灵活、强大地选择元素的方式,就是使用 Xpath 表达式。
XPath(XMLPathLanguage)是由国际标准化组织W3C指定的,用来在XML和HTML文档中选择节点的语言。
目前主流浏览器(Chrome、Firefox,Edge,Safari)都支持XPath语法,xpath有1和2两个版本,目前浏览器支持的是xpath1的语法。
既然已经有了CSS,为什么还要学习Xpath呢?因为
有些场景用css选择web元素很麻烦,而xpath却比较方便。
另外Xpath还有其他领域会使用到,比如爬虫框架Scrapy,手机App框架Appium。
请大家打开这个网址 http://f.python3.vip/webauto/test1.html
按F12打开调试窗口,点击Elements标签。
要验证Xpath语法是否能成功选择元素,也可以像验证CSS语法那样,按组合键Ctrl+F,就会出现搜索框
xpath语法中,整个HTML文档根节点用’/’表示,如果我们想选择的是根节点下面的html节点,则可以在搜索框输入
/html
如果输入下面的表达式
/html/body/div
这个表达式表示选择html下面的body下面的div元素。
注意 / 有点像CSS中的 > ,表示直接的节点关系。
2、绝对路径选择
从根节点开始的,到某个节点,每层都依次写下来,每层之间用 / 分隔的表达式,就是某元素的 绝对路径
上面的xpath表达式
/html/body/div
就是一个绝对路径的xpath表达式,等价于css表达式
html>body>div
或者
find_elements_by_xpath
举例:
elements=driver.find_elements_by_xpath("/html/body/div")
3、相对路径选择
有的时候,我们需要选择网页中某个元素, 不管它在什么位置 。
比如,选择示例页面的所有标签名为 div 的元素,如果使用css表达式,直接写一个 div 就行了。
那xpath怎么实现同样的功能呢?xpath需要前面加 // ,表示从当前节点往下寻找所有的后代元素,不管它在什么位置。
所以xpath表达式,应该这样写:
//div
’//’符号也可以继续加在后面,比如,要选择所有的div元素里面的所有的p元素,不管div在什么位置,也不管p元素在div下面的什么位置,则可以这样写
//div//p
对应的自动化程序如下
elements=driver.find_elements_by_xpath("//div//p")
如果使用CSS选择器,对应代码如下
elements=driver.find_elements_by_css_selector("divp")
如果,要选择所有的div元素里面的直接子节点p,xpath,就应该这样写了
//div/p
如果使用CSS选择器,则为
div>p
通配符
如果要选择所有div节点的所有直接子节点,可以使用表达式 //div/*
* 是一个通配符,对应任意节点名的元素,等价于CSS选择器 div>*
代码如下:
elements=driver.find_elements_by_xpath("//div/*")
for element in elements:
print(element.get_attribute('outerHTML'))