Xpath选择器-下篇

测试页面

下面给出了一个web页面对应的html。接下来我们要使用xpath表达式选择其中的元素。

请大家打开这个链接 http://f.python3.vip/webauto/test1.html

然后按F12 查看页面对应的HTML文档内容

选择所有后代节点

选择所有div节点下的所有后代P节点(’//div//p’)

elements = driver.find_elements_by_xpath("//div//p")

for element in elements:
    print(element.text)

输出结果为:

我们为什么推荐编程0基础的朋友从 python入手学习编程语言?因为 Python 易学好用。
这是为了隔离a标签
小凯老师
小雷老师

选择子节点

单个直接子节点

如果我们要选择的是 选择所有div节点的 直接子节点 P ,而不是所有的后代节点,则应该使用 单斜杠 //div/p

elements = driver.find_elements_by_xpath("//div/p")

for element in elements:
    print(element.text)

输出结果为:

我们为什么推荐编程0基础的朋友从 python入手学习编程语言?因为 Python 易学好用。
这是为了隔离a标签
小凯老师

少了一个小雷老师,因为它对应的HTML <p class="teacher">小雷老师</p> 不是div的直接子节点,如下所示

    <div class="SKnet">
       <p class="teacher">小凯老师</p>
       <span class="senior">
           <p class="teacher">小雷老师</p>
       </span>
    </div>

所有直接子节点

选择所有div节点的所有直接子节点,可以使用表达式 //div/*

* 是一个通配符,对应任意节点名的元素,代码如下

elements = driver.find_elements_by_xpath("//div/*")

for element in elements:
    print(element.text)

输出结果为:

段落:我们为什么推荐编程0基础的朋友从python入手学习编程语言? 为什么不是Java、C、C++、Javascript?因为Python> 易学好用。
Python
Python
Pythonweb开发
Django
Python网络爬虫
Scrapy
超链接测试
百度搜索

白月黑羽--在线教程

这是为了隔离a标签
百度搜索2
按钮测试
测试按钮1

测试按钮2
百度搜索3

BYHY
SK
小凯老师
小雷老师

等价于CSS选择器(‘div > *’)

elements = driver.find_elements_by_css_selector("div > *")
for element in elements:
    print(element.text)

根据属性选择

我们前面介绍的选择器中,有介绍根据class,ID来选择页面元素,在Xpath选择器中,都可以看成是根据属性来选择

根据ID

选择Id为baidu2的‘百度搜索2’,可以这样(//*[@id=’baidu2’])

elements = driver.find_elements_by_xpath("//*[@id='baidu2']")
for element in elements:
    print(element.text)

根据class

选择所有div元素中class为sknet的页面元素

elements = driver.find_elements_by_xpath("//div[@class='SKnet']")
for element in elements:
    print(element.text)

输出结果为:

BYHY
SK
小凯老师
小雷老师

可以对比这两种方法的结果

elements = driver.find_elements_by_xpath("//*[@class='teacher']")
for element in elements:
    print(element.text)

输出结果为:

BYHY
SK
小凯老师
小雷老师
BYHY2
SK2
小凯老师2
小雷老师2

根据其他属性

同样的道理,我们也可以利用其它的属性选择,比如选择所有具有style属性的所有页面元素

elements = driver.find_elements_by_xpath("//*[@style]")
for element in elements:
    print(element.text)

根据序数选择

  • 选取第2个P元素
elements = driver.find_elements_by_xpath("//p[2]")
for element in elements:
    print(element.text)
  • 选择父元素为div中P元素的第二个p子元素
elements = driver.find_elements_by_xpath("//div/p[2]")
for element in elements:
    print(element.text)
  • 选择父元素为div中第二种类型的子元素
elements = driver.find_elements_by_xpath("//div/*[2]")
for element in elements:
    print(element.text)
  • 选取最后一个P元素
elements = driver.find_elements_by_xpath("//p[last()]")
for element in elements:
    print(element.text)
  • 选取倒数第2个P元素
elements = driver.find_elements_by_xpath("//p[last()-2]")
for element in elements:
    print(element.text)
  • 选择父元素为div中P元素的倒数第二个p子元素
elements = driver.find_elements_by_xpath("//div/p[last()-2]")
for element in elements:
    print(element.text)
  • 选择父元素为div中倒数第二种类型的子元素
elements = driver.find_elements_by_xpath("//div/*[last()-2]")
for element in elements:
    print(element.text)

第几个某类型的子元素

组合选择

css选择器有组选择,可以同时选择多个元素,条件之间用逗号隔开,xpath选择器则是用竖线隔开

elements = driver.find_elements_by_xpath("//h3 | //h4")
for element in elements:
    print(element.text)

等同于CSS选择器

elements = driver.find_elements_by_css_selector("h3,h4")
for element in elements:
    print(element.text)

兄弟选择

css选择器的兄弟选择,条件之间用波浪线隔开,xpath选择器则是用following-sibling加两个冒号隔开

elements = driver.find_elements_by_xpath("//h4/following-sibling::a")
for element in elements:
    print(element.text)

等同于CSS选择器

elements = driver.find_elements_by_css_selector("h4 ~ a")
for element in elements:
    print(element.text)

更多Xpath选择器的介绍,可以参考Xpath选择器参考手册


扫码分享给朋友,一起学更有动力哦



上一页 下一页