XPath 节点
节点
在XPath中,有七种类型的节点:
- 元素
- 属性
- 文本
- 命名空间
- 处理指令
- 注释
- 文档节点(根节点)
<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
<book>
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
</bookstore>
可以得知
<bookstore> (文档节点)
<author>J K. Rowling</author> (元素节点)
lang="en" (属性节点)
J K. Rowling 基本值(无父或无子的节点)
"en" 基本值
节点关系
- 父(Parent)
- 子(Children)
- 同胞(Sibling)
- 先辈(Ancestor)
- 后代(Desendant)
XPath语法
选取节点
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点 |
/ | 从根节点选取 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑他们的位置 |
. | 选取当前节点 |
.. | 选取当前节点的父节点 |
@ | 选取属性 |
实例
路径表达式 | 结果 |
---|---|
bookstore | 选取bookstore元素的所有子节点 |
/bookstore | 选取根元素bookstore |
bookstore/book | 选取属于bookstore的子元素的所有book元素 |
//book | 选取所有book子元素,而不管它们在文档中的位置 |
bookstore//book | 选取属于bookstore元素的后代的所有book元素,而不管它们位于bookstore之下的什么位置 |
//@lang | 选取名为lang的所有属性 |
谓语
谓语用来查找某个特定的节点或者包含某个指定的值的节点。
谓语被嵌在方括号中。
实例
路径表达式 | 结果 |
---|---|
/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 |
选取未知节点
通配符 | 描述 |
---|---|
* | 匹配任何元素节点 |
@* | 匹配任何属性节点 |
node() | 匹配任何类型的节点 |
实例
路径表达式 | 结果 |
---|---|
/bookstore/* | 选取bookstore元素的所有子元素 |
//* | 选取文档中的所有元素 |
//title[@*] | 选取所有带有属性的title元素 |
选取若干路径
通过在路径表达式中使用”|”运算符,可以选取若干路径
举个栗子
我这里选取了豆瓣电影的这个页面来测试下刚学的XPath,
https://movie.douban.com/chart
还需要一个Chrome的扩展 XPath Helper
打开网页,F12,定位到一个电影信息上
可以看到每个电影信息都在<tr class="item">
中
所以其 XPath 写法应该是:
//tr[@class="item"]
打开 XPath Helper,验证我们写的是否正确,可以看到下面的图会有高亮效果,说明我们写的是正确的
接下来是电影的图片
//tr[@class="item"]//img
这个item下只有一个超链接,所以电影名称是
//tr[@class="item"]//a
电影简介是
//tr[@class="item"]//p
XPath的写法不是固定的,可以根据不同的情况使用,只要匹配的没问题就行