计算机系统应用教程网站

网站首页 > 技术文章 正文

Python +Selenium Xpath 按次序选择与组选择、父节点、兄弟节点

btikc 2024-10-25 10:57:54 技术文章 6 ℃ 0 评论

按次序选择

前面学过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')

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表