网页爬虫XPath 定位
最近使用到了XPath进行爬虫标签的定位,就将常用的语法总结了一下,方便下次使用时做参考。
1.基本语法
# 倒数第二个 book 元素
//bookstore/book[last()-1]
# 除了第一个 book 元素
//bookstore/book[position()>1]
# price 元素的值须大于 35.00 且不等于 38.00
//bookstore/book[price>35.00 and price!=38.00]
# 标签属性定位
//input[@class='container']
//input[@type='text' and @name='username']
# 标签属性条件匹配定位
//input[start-with(@id,'post')]
//input[ends-with(@id,'post')]
//input[contains(text(),'下一页')]
# 组合条件:选取 book 元素的所有 title 和 price 元素
//book/title | //book/price
# 相邻标签:选取a标签同级的上一个p元素
//a/preceding-sibling::p[1]
# 下一个p元素
//a/following-sibling::p[1]
# 父子标签:
# 上一级父标签
//a/parent::*
# 所有父标签
//a/ancestor::*
# 下一级子标签
//a/child::*
# 所有子标签
//a/descendant::*
2.高级用法
# 节点统计
count(//li[@data])')
# 字符串连接
concat(//li[@data="one"]/text(),//li[@data="three"]/text())
# 解析当前节点下的字符,作用于list时只匹配第一个
string(//li)
# 解析节点名称
local-name(//*[@id="testid"])
# 组合定位:匹配带有href属性的a标签的先辈节点中的div,其兄弟节点中前一个div节点下ul下li中text属性包含“务”字的节点的值
//a[@href]/ancestor::div/preceding::div/ul/li[contains(text(),"务")]/text()
# not:布尔值(否):不包含data属性的li标签统计
count(//li[not(@data)])
# 返回指定字符串的长度:string-length函数+local-name函数定位节点名长度小于2的元素
//*[string-length(local-name())<2]/text()
# 组合:contains函数+local-name函数定位节点名包含di的元素
//div[@id="testid"]/following::div[contains(local-name(),"di")]