https://www.w3school.com.cn/xpath/xpath_syntax.asp
- 层级
/直接子集
//跳级
./当前开始
- 属性
@属性访问
- 函数
contains(),
text()
- 条件
[ ]
- 常用xpath表达式
属性定位:
#找到class属性值为song的div标签
//div[@class="song"]
层级&索引定位:
#找到class属性值为tang的div的直系子标签ul下的第二个子标签li下的直系子标签a
//div[@class="tang"]/ul/li[2]/a
逻辑运算:
#找到href属性值为空且class属性值为du的a标签
//a[@href="" and @class="du"]
模糊匹配:
//div[contains(@class, "ng")]
//div[starts-with(@class, "ta")]
取文本:
# /表示获取某个标签下的文本内容
# //表示获取某个标签下的文本内容和所有子标签下的文本内容
//div[@class="song"]/p[1]/text() # 注意,不是p[1].text(),不是点,是/
//div[@class="tang"]//text()
取属性:
//div[@class="tang"]//li[2]/a/@href
- 例子
//div[@class="test"]//div[contains(@class,"text2")]
//div/@href #取div下的href属性
/bookstore/book[position()<3] # 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//book/title | //book/price # 选取 book 元素的所有 title 和 price 元素。
# xpath选择不包含特定子节点的节点
# xpath的(与或)用法
ret = response.xpath('//p[not (img)][not (a)][position()>5] | //div[contains(@class,"WB_text")]').extract()
//选择不包含class属性的节点
var result = node.SelectNodes(".//span[not(@class)]");
//选择不包含class和id属性的节点
var result = node.SelectNodes(".//span[not(@class) and not(@id)]");
//选择不包含class="expire"的span
var result = node.SelectNodes(".//span[not(contains(@class,'expire'))]");
//选择包含class="expire"的span
var result = node.SelectNodes(".//span[contains(@class,'expire')]");