Xpath表达式是用于XML和HTML文档中选择节点的语言。xpath语法中,整个HTML文档根节点用“/”表示,若我们想选择的是根节点下面的html结点,则在搜索框框输入 “/html/body/div”。
1、绝对路径选择
从根节点开始,到某个节点,每层一次写下来,每层之间用“/”分隔的表达式,就是某元素的绝对路径。
方法 find_elemenet_by_xpath()、find_elements_by_xpath()。
2、相对路径选择
选择网页中某个元素,无论在什么位置。xpath需要前面加 //, 表示从当前节点往下寻找所有的后代元素。所以可写为:elements=driver.find_elements_by_xpath("//div//p")。
若要选择div下的所有p元素,可以选择:elements=driver.find_elements_by_xpath("//div/p")。
3、通配符
若选择所有div节点的所有直接子节点,使用表达式 //div/*。
4、依据属性选择
xpath可以依据属性选择元素。
格式:[@属性名=‘属性值’]
注意:* 属性名注意前面有个@;
* 属性值一定要用引号,可以单/双引号;
1)依据id属性选择
选择id为west的元素,可以是 //*[@id='west']
2)依据class属性选择
选择所有select元素中class为single_choice的元素,可以这样 //select[@class='single_choice']
若一个元素class有几个,若要选他,class属性应相同的写上去。
3)依据其他属性
选择具有multiple元素的所有页面元素,可以 //*[@multiple]
4)属性值包含字符串
* 要选择style属性值包含color字符串的页面元素,可以 //*[contains(@style,'color')];
* 要选择style属性值包含color字符串开头的页面元素,可以 //*[starts-with(@style,'color')];
* 要选择style属性值以某个字符串结尾的页面元素,可以 //*[ends-with(@style,'color')];(目前浏览器不支持);
5、按次序选择
xpath依据次序选择元素,直接在方括号中使用数字表示次序。
1)第几个子元素
eg: //div/*[2] 父元素为div的第2个子元素,不管什么类型;
2)某类型倒数第几个子元素
eg: * 选择p类型倒数第1个子元素: //p[last()]
* 选择p类型倒数第2个子元素: //p[last()-1]
* 选择p类型倒数第3个子元素: //p[last()-2]
6、范围选择
xpath还可以选择子元素的次序范围。
1)选择option类型第1到2个子元素: //option[position()<=2]
//option[position()<3]
2)选择class属性为multi_choice的前3个子元素: //*[@class='multi_choice']/*[position()<=3];
3)选择class属性为multi_choice的后3个子元素: //*[@class='mulyi_choice']/*[position()>=last()-2]
7、组选择、父节点、兄弟节点
1)组选择:* css的组选择,表达式使用 逗号 隔开;
* xpath的组选择,表达式使用 竖线 隔开;
//CSS的写法:选择所有的 class为single_choice和class为multi_choice的元素 .single_choice, .multi_choice 等同于 xpath的: //*[@class='single_choice'] | //*[@class='multi_choice']
2) 选择父节点:某个元素的父节点用 /.. 表示。
eg: 选id为china的节点的父节点://*[@id='china']/..
当某个元素没有特征可以直接选择,但是他有子节点有特征,就可以采用这种方法,先选择子节点,再指定父节点。还可以继续找上层父节点。
3)兄弟节点选择:* css要选择某个节点的后续兄弟节点,用波浪线;
* xpath的语法是:following-sibling::
//CSS写法:选择class为single_choice的元素的所有后续兄弟节点 .single_choice~* // xpath的写法是: //*[@class='single_choice']/following-sibling::*
* xpath选择前面的兄弟节点:preceding-sibling::
//选择class为single_choice的元素的所有前面的兄弟节点 //*[@class='single_choice']/preceding-sibling::*
注意:要在某个元素内部使用xpath选择元素,需要 再xpath表达式最前面加个点。
elements=china.find_elements_by_xpath('.//p')