目录
- 什么是Xpath?
- 常见的Xpath中节点及节点间的关系
- Xpath路径表达式(节选)
2018.3.28更新
补充说明了 /
(根节点的作用)
说明了/
与//
的区别
什么是Xpath?
Xpath是XML-路径语言的简称。顾名思义,Xpath可以用于定位XML文本的节点,但实际上,Xpath也适用于定位HTML中的节点。
节点及节点间的关系
在HTML中,节点就是一个个HTML标签。分析节点间的关系也就是要清楚HTML文档中各标签间的关系。厘清这些关系对于书写Xpath路径表达式来说非常重要。
节点间的关系(下面通过一段HTML代码说明:)
<div class="header-wrapper">
<a href="http://www.baidu.com">
<a href="http://blog.jobbole.com"><img src="xxx" alt="文章" /></a>
</div>
父节点(Parent)
元素div是元素a的父节点;第二个元素a也是元素img的父节点。
子节点(Children)
元素a是元素div的子节点;元素img是子节点。
兄弟/同胞节点(Sibling)
兄弟节点在HTML中的地位相等,它们有相同的父节点。如上面例子中,两个a元素互为兄弟节点。
先辈节点(Descendant)
对于img元素来说,它的父节点(第二个a元素),和它的父节点的父节点(元素div)统称为img的先辈节点。在一个HTML文件中,先辈节点一般不唯一,比如这里的例子中,元素img的先辈节点包含两个元素。
后代节点(Descendant)
对于img元素来说,它的子节点(第二个a元素),和它的子节点的子节点(元素img)统称为div的后代节点。
在使用Xpath中,搞清楚节点间的关系是非常重要的。
Xpath路径表达式(节选)
XPath 使用路径表达式来选取 XML 文档(或是HTML文档)中的节点或节点集。下面列举一些常见的路径表达式。
路径表达式 | 描述 |
---|---|
/div/p | 选取div下的所有p节点(p必须是div的子节点) |
/div//a | 选取div下所有a节点而不考虑其位置(a标签只要是div的子孙节点即可) |
@class | 选取名为class的属性 |
/div/.. | 选取div的父节点 |
-
/
表示从根节点开始(html文件中是html节点),而根节点后不一定是div节点,但为了表达简洁,省略了div节点前的部分路径表达式,后面也是。实际使用时需要注意。
再看稍微复杂的情况
路径表达式 | 描述 |
---|---|
/div/a | 从根节点开始选取div节点下的a节点 |
/div/a[2]/img | 从根节点开始选取div节点下的第二个a节点下的img节点 |
//div[@class="header-wrapper"] | 选取所有属性class的值为header-wrapper的div节点 |
- 在节点后加上带有数字的方括号,可以根据兄弟节点在文档中出现的先后次序选择元素(数字1为第一个依次类推)。如果说我想取一个元素,而它从倒数来看更加方便,那该如何取呢?后面将说明这种方法。
- 通过在节点后加上带有属性名-值对的方括号,可以筛选出需要的节点。属性值的写法为:@属性名=“属性值”
选取位置元素和属性
路径表达式 | 描述 |
---|---|
//*/di | 选取文档中所有元素 |
//@* | 选取文档中所有带属性的元素 |
最后介绍Xpath中一些常用的函数
路径表达式 | 描述 |
---|---|
/div/p/text() | 选取p节点的文本内容 |
//div[contains(@class,"post")] | 选取带有class属性且值包含“post”的所有div节点 |
/div/p[last()-1] | 选取div下倒数第二个p节点 注:last()后的数字没有表示倒数第一 |
- 适用路径表达式时必须将其包围在一对单引号(或双引号)中。如果路径表达式外是双引号,则路径表达式中的属性值必须用单引号;如果路径表示外是单引号,则路径表达式中的属性值必须用双引号,以此来避免歧义。
- contains函数在提取一个带有多值属性的节点时很有帮助
选取多个元素——在路径表示中使用'|'
路径表达式 | 描述 |
---|---|
/div/a | /div/p | 选取div下的a节点和div下的p节点 |
更新ing..
网友评论