第九章 Xpath选择器之高级篇

测试页面

对如下的web进行选择,可以复制到本地,保存为test.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>SKNet</title>
    <base target="_blank" />
</head>

<body>
    <h3>Web元素选择测试界面</h3>
    <p>欢迎来到思凯网络学院</p>
    <p>欢迎来到思凯网络 - 思凯网络,专注起点</p>
    <hr />

    <div style="background-color:#99FFFF; color:black; padding:10px; font-family:Comic Sans MS; font-size:16px; text-align:left;">
        <p>段落:我们为什么推荐编程0基础的朋友从<span>python</span>入手学习编程语言? 为什么不是Java、C、C++、Javascript?因为<span>Python</span>> 易学好用。</p>
        <span>Python</span> 的创造者们,创建出<span>Python</span> 语言,出发点就是希望它 既 简单易用 又 高效又强大。 所以天生就携带 易学好用的基因
    </div>

    <div>
        <h4>超链接测试</h4>
        <a href="http://www.baidu.com" id="baidu">百度搜索</a><br />
        <a href="http://www.python3.vip" id="BYHY">白月黑羽--在线教程</a><br />
        <p>这是为了隔离a标签</p>
        <a href="http://www.baidu.com" id="baidu2">百度搜索2</a>
    </div>

    <div>
        <h5>按钮测试</h5>
        <button name='button' id="BT1">测试按钮1</button><br />
        <button name='button' id="BT2">测试按钮2</button>
        <a href="http://www.baidu.com" id="baidu3">百度搜索3</a><br />
    </div>

    <div class="SKnet">
        <p class="teacher">BYHY</p>
        <p class="teacher">SK</p>
        <p class="teacher">小凯老师</p>
        <p class="teacher">小雷老师</p>
    </div>

    <div>
        <p>===========================================</p>
    </div>
    <p>Xpath test</P>
   </body>
</html>

选择后代节点

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

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

for eleObj in eleObjList:
    print(eleObj.text)

输出结果为:

段落:我们为什么推荐编程0基础的朋友从python入手学习编程语言? 为什么不是Java、C、C++、Javascript?因为Python> 易学好用。
Django
Scrapy
这是为了隔离a标签
BYHY
SK
小凯老师
小雷老师

选择子节点

单个直接子节点

选择所有div节点的子节点P(’//div/p’)

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

for eleObj in eleObjList:
    print(eleObj.text)

输出结果为:

段落:我们为什么推荐编程0基础的朋友从python入手学习编程语言? 为什么不是Java、C、C++、Javascript?因为Python> 易学好用。
这是为了隔离a标签
BYHY
SK
小凯老师
小雷老师

所有直接子节点

选择所有div节点的所有直接子节点(’//div/*‘)

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

for eleObj in eleObjList:
    print(eleObj.text)

输出结果为:

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

白月黑羽--在线教程

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

测试按钮2
百度搜索3

BYHY
SK
小凯老师
小雷老师

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

eleObjList = driver.find_elements_by_css_selector("div > *")
for eleObj in eleObjList:
    print(eleObj.text)

根据属性选择

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

根据ID

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

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

根据class

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

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

输出结果为:

BYHY
SK
小凯老师
小雷老师

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

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

输出结果为:

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

根据其他属性

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

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

根据序数选择

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

第几个某类型的子元素

组合选择

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

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

等同于CSS选择器

eleObjList = driver.find_elements_by_css_selector("h3,h4")
for eleObj in eleObjList:
    print(eleObj.text)

兄弟选择

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

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

等同于CSS选择器

eleObjList = driver.find_elements_by_css_selector("h4 ~ a")
for eleObj in eleObjList:
    print(eleObj.text)

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


本文还不错? 分享给你的朋友吧

上一页 下一页