按次序选择
前面学过css表达式可以根据元素在父节点中的次序选择,非常实用。
xpath也可以根据次序选择元素。语法比css更简洁,直接在方括号中使用数字表示次序
比如
某类型第几个子元素
比如要选择p类型第2个的子元素,就是
br//p[2]
注意,选择的是 p类型第2个的子元素 ,不是 第2个子元素,并且是p类型 。
注意体会区别
再比如,要选取父元素为div中的p类型第2个子元素
//div/p[2]
第几个子元素
也可以选择第2个子元素,不管是什么类型,采用通配符
比如选择父元素为div的第2个子元素,不管是什么类型
br//div/*[2]
某类型倒数第几个子元素
当然也可以选取倒数第几个子元素
比如:
选取p类型倒数第1个子元素
br//p[last()]
选取p类型倒数第2个子元素
br//p[last()-1]
选择父元素为div中p类型倒数第3个子元素
br//div/p[last()-2]
范围选择
xpath还可以选择子元素的次序范围。
比如:
选取option类型第1到2个子元素
//option[position()<=2]
或者
//option[position()<3]
选择class属性为multi_choice的前3个子元素
//*[@class='multi_choice']/*[position()<=3]
选择class属性为multi_choice的后3个子元素
//*[@class='multi_choice']/*[position()>=last()-2]
不是 last()-3 的原因为:
last() 本身代表最后一个元素
last()-1 本身代表倒数第2个元素
last()-2 本身代表倒数第3个元素
组选择、父节点、兄弟节点
组选择
css有组选择,可以同时使用多个表达式,多个表达式选择的结果都是要选择的元素
css组选择,表达式之间用逗号 隔开
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可以选择父节点,这是css做不到的。
某个元素的父节点用 /.. 表示
比如,要选择id为china的节点的父节点,可以这样写:
//*[@id='china']/..
当某个元素没有特征可以直接选择,但是它有子节点有特征,就可以采用这种方法,先选择子节点,再指定父节点。
还可以继续找上层父节点,比如:
//*[@id='china']/../../..
兄弟节点选择
前面学过css选择器,要选择某个节点的后续兄弟节点,用 波浪线
xpath也可以选择后续兄弟节点,用这样的语法
follow-sibling::
比如,要选择class为single_choice的元素的所有后续兄弟节点
//*[@class='single_choice']/following-sibling::*
等同于CSS选择器:
.single_choice~*
如果,要选择后续节点中的div节点,就应该这样写:
//*[@class='single_choice']/following-sibling::div
xpath还可以选择 前面的 兄弟节点,用这样的语法:
preceding-sibling::
比如,要选择class为single_choice的元素的所有后续兄弟节点
//*[@class='single_choice']/preceding-sibling::*
而CSS选择器目前还没有方法选择前面的兄弟节点。
Selenium注意点
举例代码:
先选择示例网页中,id是china的元素
然后通过这个元素的WebElement对象,使用find_elements_by_xpath,选择里面的p元素
#先寻找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'))
运行发现,打印的不仅仅是china内部的p元素,而是所有的p元素。
要在某个元素内部使用xpath选择元素,需要 在xpath表达式最前面加个点 。
elements=china.find_elements_by_xpath('.//p')