selenium——Xpath选择器

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

学xpath的意义在于部分场景用css选择web元素很麻烦而xpath 却比较方便

另外 Xpath 还有其他领域会使用到比如 爬虫框架 Scrapy 手机App框架 Appium。

文章目录


path 语法中整个HTML文档根节点用’/‘表示如果我们想选择的是根节点下面的html节点则可以在搜索框输入 /html

如果输入下面的表达式
/html/body/div

这个表达式表示选择html下面的body下面的div元素

/ 有点像CSS中的 > 表示直接子节点关系


绝对路径

从根节点开始的到某个节点每层都依次写下来每层之间用 / 分隔的表达式就是某元素的 绝对路径

例如上面的xpath表达式 /html/body/div
等价于CSS表达式html>body>div

自动化程序要使用Xpath来选择web元素应该调用 WebDriver对象的方法 find_element_by_xpath 或者 find_elements_by_xpath

elements=driver.find_elements(By.XPATH,"/html/body/div")

相对路径

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,"div p")

如果要选择所有div中的 直接子节点 pxpath应该这么写
//div/p

如果使用CSS选择器则为 div>p

🐗通配符

xpath中如果要选择所有div节点的所有直接子节点可以使用表达式

//div/*

"*"是一个通配符对应任意节点名的元素等价于CSS选择器的

div>*

示例

elements = driver.find_elements(By.XPATH, "//div/*")
for element in elements:
    print(element.get_attribute('outerHTML'))	#打印html信息

根据属性选择

Xpath 可以根据属性来选择元素。

根据属性来选择元素 是通过 这种格式来的 [@属性名=‘属性值’]

🌋根据id属性选择

选择id为west的元素

//*[@id='west']

属性名前要有@属性值一定要用引号

🎠根据class属性选择

选择所有 select 元素中 class为 single_choice 的元素可以这样

//select[@class='single_choice']

如果一个元素class有多个比如

<p id="beijing" class='capital huge-city'>
    北京    
</p>

对应的xpath就是

//p[@class="capital huge-city"]

不能只写一个属性

🚣根据其他属性

同样的道理我们也可以利用其它的属性选择

比如选择 具有multiple属性的所有页面元素 可以这样

//*[multiple]

🦊属性值包含字符串

  1. 要选择style属性值包含color字符串的页面元素
//*[contains(@style,'color')]
  1. 要选择style属性值以color字符串开头的页面元素
//*[starts-with(@style,'color')]

目前浏览器不支持以某字符串结尾的页面元素的方法

按次序选择

xpath也可以根据次序选择元素。 语法比css更简洁直接在方括号中使用数字表示次序

🌏某类型第几个子元素

选择p类型的第二个子元素

//p[2]

选取父元素为div的p类型的第2个子元素

//div/p[2]

📫第几个子元素

选取父元素为div的所有元素的第二个子元素

//div/*[2]

👒某类型倒数第几个元素

选取p类型倒数第一个子元素

//p[last()]

选取p类型倒数第2个子元素

//p[last()-1]

选取父元素为div中p类型倒数第三个子元素

//div/p[last()-2]

🍹范围选择

xpath还可以选择子元素的次序范围

选取option类型第1到2个子元素

//option[position()<=2]

或者

option[position()<3]

选择class属性为multi_choice的前三个子元素

//*[@class='multi_choice']/*[position()<=3]

选取class属性为multi_choice的后三个子元素

//*[@class='multi_choice']/*[position()>=last()-2]

last() 本身代表最后一个元素

last()-1 本身代表倒数第2个元素

last()-2 本身代表倒数第3个元素

组选择父节点兄弟节点

👾组选择

xpath中组选择使用竖线隔开多个表达式

所有的option元素和所有的h4元素

//option|//h4

等同于CSS选择器

option,h4

再比如要选所有的 class 为 single_choice 和 class 为 multi_choice 的元素

//*[@class='single_choice']|//*[@class='multi_choice']

等同与CSS选择器

.single_choice,.multi_choice

🍭选择父节点

xpath可以选择父节点某个元素的父节点用**“/. .”**表示

选择id为china的节点的父节点

//*[@id='china']/..

当某个元素没有特征可以直接选择但是它有子节点有特征 就可以采用这种方法先选择子节点再指定父节点。

还可以继续找上层父节点

//*[@id='china']/../../..

🚟兄弟节点选择

CSS中选择某个节点的后续兄弟节点用波浪线~

xpath选择后续兄弟节点用following-sibling::

比如要选择class为single_choice的元素的所有后续兄弟节点

//*[@class='single_choice']/following-sibling::*

xpath还可以选择前面的兄弟节点
语法 prceding-sibling::

比如要选择 class 为 single_choice 的元素的所有前面的兄弟节点

//*[@class='single_choice']/preceding-sibling::*

CSS选择器目前还不能选择器前面的兄弟节点


selenium注意点

要在某个元素内部使用xpath需要在xpath表达式最前面加个点

例如

# 先寻找id是china的元素
china = wd.find_element(By.ID, 'china')

# 再选择该元素内部的p元素
elements = china.find_elements(By.XPATH, './/p')

# 打印结果
for element in elements:
    print('----------------')
    print(element.get_attribute('outerHTML'))
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6