来自Xavier的笔记:https://segmentfault.com/u/lihanx and https://segmentfault.com/q/1010000008883941
菜鸟Xpath教程:http://www.runoob.com/xpath/xpath-tutorial.html
一、基本语法
1. 表达式
nodename # 节点名
/ # 若在起始位置,则表明从根节点选取node;若不在起始位置,表明选取子节点,本意都是选取全部子节点
// # 从任意位置选取node节点
@ # 选取属性
* # 通配符
2.谓语
[n] # 第n个
[last()] # 最后一个
[position()<n] # 第n个位置之前的全部指定节点
node[@attr] # 拥有attr属性的节点
node[@attr='val'] # 属性attr的值为val的节点
二、轴
A/child::B ==> A/B # 选取A节点的子节点B
parent # 父节点
descendant # 所有后代节点
ancestor # 所有先辈节点
descendant-or-self # 所有后代元素及其本身
preceding-sibling # 所有先辈节点及其本身
following-sibling # 当前节点后面的同级节点
preceding # 整个文档中,当前节点之前的所有节点
preceding-sibling # 父节点中,当前节点之前的所有同级节点
following # 整个文档中,当前节点之后的所有节点
self # 当前节点本身
attribute # 当前节点的所有属性
namespace # 当前节点所有的命名空间
三、运算符
| # 并集
+ # 加法
- # 减法
* # 乘法
div # 除法
= # 等于
!= # 不等于
< # 小于
<= # 小于
> # 大于
>= # 大于等于
or # 或
and # 与
mod # 取余
四、示例
element_dom.xpath(“/div”)
# 选取根节点的子节点div(包含其全部后代节点)
element_dom.xpath("//p")
# 选取任意位置的p节点
element_dom.xpath("//div[@class='title']")
# 选取class值为title的div节点
element_dom.xpath("//div[@class='item_list']//li/a/@href")
# 选取任意位置的class为item_list的div节点 的全部子节点li 中a节点的href属性
element_dom.xpath("/div/@name")
# 选取div节点的name属性值
element_dom.xpath("/div/descendant::text()")
# 选取div节点全部后代节点的文本
element_dom.xpath("//div/p|//ul/li/a")
# 选取div节点的子节点pa 与 ul/li/a 的并集
element_dom.xpath("//div/p[2]")
# 选取div中名为p的子节点的第2个
element_dom.xpath("//div/*[id='name']")
# 选取div的子节点中id值为name的任意节点
element_dom.xpath("(//div//p)[1]")
# //div//p结果集中的第一个结果