Xpath 高级用法

xpath 高级用法

1. 匹配当前节点下的所有:

.//
.   表示当前
//  表示当前标签下的所有标签
注: 要配合使用

2. 匹配某标签的属性值: /@属性名称

这里以input里的value值为例:

例:xpath(//input/@value)

3. 匹配多个路径

在一个xpath中写的多个表达式用 | 分开, 每个表达式互不干扰。
xpath("//tr[6]/td[2]/text() | //tr[7]/td[2]/text()")

4. 按属性匹配:@获取所有id="test"的所有文本内容

xpath('//*[@id="test"]//text()')

5. 匹配不包含某个属性的标签 not

多用于表格中匹配中不包含表头信息的数据
xpath('//table/tr[not(@class="tbhead")]')

6. 匹配包含多个属性的标签: and匹配所有的tr中不包含 tbhead 属性 和包含 head 的tr标签

xpath('//table/tr[not(@class="tbhead") and @class="head"]')

7. 匹配包含不同属性的名称相同的标签

or匹配包含class="speedbar" 或者 class="content-wrap" 的标签

xpath('//div[@class="speedbar" or @class="content-wrap"]')

8. 将对象还原为字符串:

etree.tostring()将匹配到的对象,作为etree.tostring()的参数即可,  注: 返回字符串

sObj = xml.xpath('//*[@id="test"]')[0] #使用xpath定位一个节点
sStr = etree.tostring(sObj)

9. 按轴(Axes)匹配

9.1 选取当前节点的所有子元素: child获取div下的tr的标签

xpath('//div[@id="testid"]/child::tr/td/text()') # 感觉这种方法鸡肋,
//div[@id="testid"]//tr/td 也可以实现

9.2 选取当前节点的所有属性:attribute

获取div标签所有的属性值

xpath('//div/attribute::*') # 感觉这种方法鸡肋,//div/@* 同样能实现

9.3 ancestor:父辈元素 / ancestor-or-self:父辈元素及当前元素

获取父辈元素的div的所有属性值, 在不好定位的情况下,通过孩子标签定位,这种方法可以用

xpath('//div[@id="test"]/ancestor::div/@*')
xpath('//div[@id="test"]/ancestor-or-self::div/@*')

9.4 descendant:后代 / descendant-or-self:后代及当前节点本身

获取孩子元素的div的所有属性值,感觉鸡肋

xpath('//div[@id="test"]/descendant::div/@*')
xpath('//div[@id="test"]/descendant-or-self::div/@*')

9.5 选取当前节点的所有命名空间节点:namespace

xpath('//div[@id="test"]/namespace::*')

9.6 定位:position

和通过下标定位一样, 方法鸡肋

xpath('//*[@id="test"]/ol/li[position()=2]/text()')

10.Xpath 函数:

10.1统计数量:count

统计符合要求节点的数量,  注: 返回字符串

xpath('count(//tr[@info])')

10.2 字符串拼接 :concat

统计出来的两个内容的字符串进行“ + ”处理, 注: 返回字符串

xpath('concat(//li[@id="one"]/text(),//li[@id="three"]/text())')

10.3 解析当前节点下的字符:string

string()直解析匹配的第一个标签的值,  注: 返回字符串

xpath('string(//tr)')

10.4 获取当前节点的节点名称: local-name

返回当前属性的节点名称,  注: 返回字符串

xpath('local-name(//*[@id="test"])')

10.5 以指定的字符开头:starts-with

starts-with定位属性值以8开头的li元素

xpath('//tr[starts-with(@code,"one")]/text()')

10.6 小于:<

匹配所有tr标签属性info小于200的内容

xpath('//tr[@info<200]/text()')

11. 根据指定的文本内容选择

# 指定的文本内容可以是文本内容的部分, 也可以是全部
//div[2]/ul/li[contains(text(), "指定的文本内容")]/span/text()

12 . 获取在此节点下的所有内容

//*[@class="init-content"]/..

13 position:定位

选择偶数项:[position()=(position() mod 2 = 0)]

选择奇数项:[position()=(position() mod 2 != 0)]

14 其他

后面+:: 然后输入标签 或者数字

child:选取当前节点的子元素
parent:选取当前节点的父节点
attribute:选取当前节点的属性
ancestor:父辈元素 / ancestor-or-self:父辈元素及当前元素
descendant:后代 / descendant-or-self:后代及当前节点本身
方法同上

following :选取当前节点的结束标签之后的所有节点,包括节点的子孙节点
preceding:选取当前节点的开始标签之前的所有节点,包括节点的子孙节点
following-sibling:选取当前节点之后的所有同级节点
preceding-sibling:选取当前节点之前的所有同级节点
### XPath 高级用法示例与技巧 XPath 是一种强大的查询语言,用于从 XML 或 HTML 文档中提取数据。以下是几个高级用法的例子和技术: #### 1. 使用谓词过滤节点 可以通过复杂的条件来筛选特定的节点集合。例如,选择所有具有 `price` 属性且其值大于 30 的 `book` 节点: ```xpath //book[@price > 30] ``` 这种语法允许通过属性或其他子节点的内容进一步细化匹配的结果[^1]。 #### 2. 组合多个路径表达式 可以组合多个路径表达式以获取更复杂的选择集。例如,选取所有的 `title` 和 `author` 元素: ```xpath //book/title | //book/author ``` 这会返回两个不同类型的节点列表,并将其合并成单一结果集。 #### 3. 利用轴(Axes) 除了默认的子树遍历外,还可以利用其他方向上的关系来进行导航。比如,“ancestor” 可以上溯到父辈或者更高层祖先;而 “following-sibling” 则能访问当前节点之后同级别的兄弟姐妹们。 - 获取某个 `<section>` 下面紧接着的一个段落标签 `<p>` : ```xpath /html/body/section/following-sibling::p[1] ``` 这些特殊的定位方式提供了极大的灵活性,在处理嵌套结构时尤为有用。 #### 4. 函数支持 XPath 提供了一系列内置函数帮助完成字符串操作、数值计算以及日期时间管理等功能。下面展示如何查找包含指定单词的所有图书标题: ```xpath //book/title[contains(., 'Cooking')] ``` 这里 `.`, 表达的是当前上下文中的文本内容; contains() 方法检测是否存在部分匹配的情况. 另外还有像 count(), sum() 这样的聚合运算符可用于统计数量或求总和等场景下非常方便实用. #### 5. 命名空间处理 (Namespace Handling) 当面对带命名空间定义的数据源时候, 正确声明并应用相应的前缀变得至关重要. 假设我们的文档中有如下形式的声明:`xmlns:ns="http://example.com/ns"` 那么针对该范围内的元素应该这样写: ```xpath //*[local-name()='elementName' and namespace-uri()='http://example.com/ns'] ``` 或者是预先绑定好映射关系后再正常书写: ```xpath //ns:elementName ``` 这两种方法都可以有效解决因名字冲突引起的问题. 上述只是关于XPath的一些基础介绍及其进阶特性的一部分说明而已.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值