- 以CSDN博客首页为例,查找登录链接。
- 打开页面,按
F12
查看源码 - 按
CTRL+F
调出查找输入框,输入你要查找的元素信息(比如输入登录
查找它在源码中的位置)。
或者先点击左上角的箭头,然后点击你想查看的登录/注册
,右侧就会以灰色背景提示你所点击的元素的对应源码。
然后有好几种方法可以确定元素的xpath:
-
最简单的办法就是在源码上点击右键,选择
Copy-Copy xpath
-
可以按照HTML标签的层级在输入框中输入,一步步查找
比如/html/body/div/div/div/div[3]/div/div/a
,在输入的时候,对应的元素会以黄色背景高亮显示。遇到同一个层级的相同元素,比如并列的几个<div>
元素,就加上中括号,里面输入它在层级中的顺序。比如div[3]
即为相同层级的第3个div
元素。
-
根据class来查找,源码中我们可以看到它对应的class是
class="toolbar-btn toolbar-btn-login csdn-toolbar-fl "]
,那么我们双击class的位置,复制class的内容,然后在输入框中输入//div[@]
,//
表示所有元素,不限定位置。div
表示div
标签,中括号当中输入特征。然后在@后面粘贴对应的特征。
//div[@class="toolbar-btn toolbar-btn-login csdn-toolbar-fl "]
它也会黄色高亮显示。
-
也可以通过链接
href=
来查找,同样双击href=xxx
的位置,复制粘贴到查找输入框:
//a[@ href="https://passport.csdn.net/account/login"]
-
同样地,也可以通过id属性来定位。最常见的属性为id,name,class等等,对于属性的类别没有特殊限制,只要能够唯一地标识一个元素即可。
当单个属性不足以唯一标识某一个元素时,也可以采取条件组合的方式,例如:
//div[@id='xxx' and @name='xxx']
-
通过
text()
方法定位
//a[text()='登录/注册']
-
通过
contains()
方法定位
//标签名[contains(@属性, '属性值')]
//a[contains(@href,'login')]
-
如果一个元素无法通过自身属性直接定位到,则可以先使用上述方法定位它的父(或者更上一级的)元素,然后再找下一级即可。
例如//div[@class='toolbar-btns onlyUser']/div
,就是通过@class='toolbar-btns onlyUser'
找到它的上一级元素,然后定位到下一级的div标签:
常见路径表达式
表达式 | 说明 |
---|---|
nodename | 选取此节点的所有子节点 |
/ | 从根节点选取 |
// | 选取符合匹配调节的节点,处于任意位置均可 |
. | 选取当前节点 |
… | 选取父节点 |
@ | 选取属性 |
通配符
通配符 | 说明 |
---|---|
* | 匹配任何元素节点 |
@* | 匹配任何元素属性 |
node() | 匹配任何类型的节点 |
实例
路径表达式 | 结果 |
---|---|
link | 选取link元素的所有子节点 |
/html | 选取根元素html |
/html/body/div | 选取位于/html/body下面一个层级的所有div元素 |
/html/body/div[2] | 选取位于/html/body下面一个层级的第2个div元素 |
/html/body/div[last()-1] | 选取位于/html/body下面倒数第2个div元素 |
//div | 选取所有div元素,而不管它们的位置在哪里 |
//@id | 选取所有带id属性的元素 |
//*[@id=‘csdn-toolbar’] | 选取所有id='csdn-toolbar’的元素 |
//div[@lang=‘en’] | 选取所有lang='en’的div元素 |
/bookstore/book[price>30] | 选取bookstore中的book元素,且其中的price元素必须>30 |
/bookstore/book[price>30]/title | 选取bookstore中的book元素的title元素,且其中的price元素必须>30 |
题外话: selenium+chromedriver还有更快速的方法来定位链接,无需通过xpath:
比如element = browser.find_element_by_link_text("登录/注册")
参考文献: