XPath定位

本文详细探讨了XPath在网页元素定位中的应用,包括id、name、link、xpath等定位方法的优缺点,以及如何通过经验积累优化xpath表达式。通过案例分析,展示了如何在实际场景中灵活运用XPath解决定位难题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们知道,selenium的元素定位有以下几种方法:

  • id=id
  • name=name
  • dom=javascriptExpression
  • xpath=xpathExpression
  • link=textPattern
  • css=cssSelectorSyntax

1. 通过id,name,link来定位

  (以下是在baidu中,查询“test”,在查询结果显示后,点击上方的“新闻”连接)

selenium 学习(2)--Xpath的知识 - 流口水的小猪 - 轨迹

 上面的id,name有个问题,就是开发人员有时不会使用id 或者name;或者name有重复的;或者id/name是系统自动生成的,随机的。相对来说link的使用具有一定的实际意义。

2. 通过xpath定位

    下面的操作示意 如下,准备注册baidu用户 

selenium 学习(2)--Xpath的知识 - 流口水的小猪 - 轨迹
 
核心代码如下图
selenium 学习(2)--Xpath的知识 - 流口水的小猪 - 轨迹
 
 
对以上的补充说明=========================
其实通过firebug,我们能看到性别选择的时候,我们用name,id都不能处理(name是一样的,id没有)
selenium 学习(2)--Xpath的知识 - 流口水的小猪 - 轨迹
这时只能用xpath。这里我们用到了工具Xpath Checker 帮助我们来定位。
不过,Xpath Checker不一定能给出最好的xpath。
例如,我们看到代码中“女”的按钮时://input[@name='sex' and @value='2']
                               直接用工具得到的:id('sex')/x:div[2]/x:input[2]
我们还是需要通过经验的积累来优化xpath的写法。即,xpath的定位表达式不只一种。一个元素可能有好几种的表达式。
 
对Xpath的学习=======================
什么是 XPath?
XPath 使用路径表达式在 XML 文档中进行导航,是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。
XPath 包含一个标准函数库.XPath 含有超过 100 个内建的函数。这些函数用于字符串值、数值、日期和时间比较、节点和 QName 处理、序列处理、逻辑值等等。

在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。
 
 下面将w3school的部分内容转过来 http://www.w3school.com.cn/xpath/xpath_syntax.asp
 
<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
<book>
  <title lang="eng">Harry Potter</title>
  <price>29.99</price>
</book>
<book>
  <title lang="eng">Learning XML</title>
  <price>39.95</price>
</book>
</bookstore>
 
选取节点
XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。
下面列出了最有用的路径表达式:

 表达式 描述
 nodename 选取此节点的所有子节点。
 / 从根节点选取。
 // 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
 . 选取当前节点。
 .. 选取当前节点的父节点。
 @ 选取属性。

  

 谓语(Predicates)

谓语用来查找某个特定的节点或者包含某个指定的值的节点。

谓语被嵌在方括号中。

实例

在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:

  路径表达式 结果
 /bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素
  /bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素
 /bookstore/book[last()-1] 选取属于 bookstore 子元素的倒数第二个 book 元素。
 /bookstore/book[position()<3] 选取最前面的两个属于 bookstore 元素的子元素的 book 元素
 //title[@lang] 选取所有拥有名为 lang 的属性的 title 元素
 //title[@lang='eng'] 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
 /bookstore/book[price>35.00] 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
  /bookstore/book[price>35.00]/title 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。
  


### XPath 元素定位的基本方法与示例 XPath 是一种用于在 XML 或 HTML 文档中查找信息的语言,能够通过路径表达式来选择节点或节点集。以下是关于如何使用 XPath 进行元素定位的详细说明和示例。 #### 1. 基础语法 XPath 使用路径表达式来选择节点。以下是一些常见的基础语法: - `//`:从文档的任何位置选择节点。 - `/`:从根节点开始选择节点。 - `.`:表示当前节点。 - `..`:表示当前节点的父节点。 - `@`:用于选择属性。 例如,要选择所有具有特定类名的 `div` 元素,可以使用以下 XPath 表达式[^3]: ```xpath //div[@class="tab-title"] ``` #### 2. 匹配属性值 如果需要根据某个属性的值来定位元素,可以使用 `[@attribute='value']` 的形式。例如,查找所有包含 `userName` 属性的元素[^2]: ```xpath //*[@userName] ``` #### 3. 使用文本内容定位 可以通过 `contains()` 函数来匹配元素中的部分文本内容。例如,查找包含特定文本的 `div` 元素[^3]: ```xpath //div[contains(text(), '模板规则列表')] ``` #### 4. 匹配子元素 当需要定位某个元素的子元素时,可以结合路径表达式实现。例如,查找具有特定类名的 `div` 元素下的 `span` 子元素[^3]: ```xpath //div[@class="h-ctrl h-close"]/span ``` #### 5. 处理命名空间 在某些情况下,XML 文档可能包含命名空间。此时需要声明命名空间并在 XPath 查询中使用。例如,在 Python 中处理命名空间[^4]: ```python namespaces = {'abc': 'http://example.com/books'} result = tree.xpath('//abc:book/abc:title', namespaces=namespaces) ``` #### 6. 综合示例 假设有一个 HTML 结构如下: ```html <div class="container"> <p class="info">Hello World</p> <a href="https://example.com">Link</a> </div> ``` - 查找所有具有 `container` 类名的 `div` 元素: ```xpath //div[@class="container"] ``` - 查找 `container` 类名下的 `p` 元素: ```xpath //div[@class="container"]/p ``` - 查找具有 `href` 属性且值为 `https://example.com` 的 `a` 元素: ```xpath //a[@href="https://example.com"] ``` ### 注意事项 在实际应用中,HTML 文档可能会存在动态生成的内容或复杂的嵌套结构。因此,建议在编写 XPath 表达式时尽量保持简洁,避免过度依赖具体的 DOM 结构[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值