Xpath 使用笔记
- 别在想这个和正则学哪个了,这个不学,爬虫白学
初级
所有的div标签
xptah = '//div'
所有的有id属性的div
xptah = '//div[@id]'
所有的没有id属性的div
xptah = '//div[not(@id)]'
所有的没有属性的div
xptah = '//div[not(@*)]'
所有的div,选择其中的第四个
xptah = '//div[4]'
所有的id为data的div
xptah = '//div[@id=‘data’]'
- ==因为 id 是唯一所以只能匹配到一个==
所有的id为data 且 class为page的div
xptah = '//div[@id=‘data’ and @class='page']'
所有id为data 且 标签内文本为测试的div
xptah = '//div[@id='data' and text()='测试']'
所有id为data 或者 id为page的div
xptah = '//div[@id='data' or @id='page']'
所有的div标签 和 p标签
xptah = '//div | //p'
所有的div标签 和 p标签且div的id为data ,p标签内文本为测试
xptah = '//div[@id='data'] | //p[text()='测试']'
定位标签名为 a 或者 标签名为 span 的所有标签
xptah = '//*[name()='a' or name()='span']'
中级
- 所有的div下的span子标签 ==child==
xptah = '//div/child::span'
- 等价于:
xptah = '//div/span'
- 定位所有div的class属性值 ==attribute==
xptah = '//div/attribute::class'
- 等价于:
xptah = '//div/@class'
- 定位ul的父节点 ==parent==
xptah = '//ul/parent:: *'
- 等价于:
xptah = '//ul/..'- ~~tips: /. 代表自己 /self
- ~~tips: /.. 代表父类 /parent:: *
- 定位ul的所有父节点div ==父类的父类== ==ancestor-or-self==
xptah = '//ul/ancestor-or-self::div'
- -or-self:表示包含自身,但上述标签是ul,所以不会被div定位到
- 定位ul的所有后代div ==后代的后代== ==descendant-or-self==
xptah = '//ul/descendant-or-self::div'
- 等价于:
//ul//div
- -or-self:表示包含自身,但上述标签是ul,所以不会被div定位到
定位ul结束标签之后的所有div ==不包含 ul 本身== ==following==
xptah = '//ul/following::div'
定位ul开始标签之前所有节点div ==不包含 ul 本身== ==preceding==
xptah = '//ul/preceding::div'
tips:这两个定位都是优先获取接近开始和结束的标签
定位ul开始标签之前所有的同级节点div ==不包含 ul 本身== ==preceding-sibling==
xptah = '//ul/preceding-sibling::div'
位置定位 ul下所有的li标签,且li标签的位置大于3小于6 ==position==
xptah = '//ul/li[position()>3 and position() <6]'
- ==只定位到第 4 个和第 5 个==
位置定位 ul下最后一个li标签 ==last()==
xptah = '//ul/li[last()]'
---
高级
- 定位所有id属性名去除前后空格后为data的div ==normalize-space==
xptah = '//div[normalize-space(@id)='data']'
- 定位子标签下li大于两个的ul ==count==
xptah = '//ul[count(li)>2]'
- tips:这里可以使用大于,小于,等于,大于小于等多种
- 定位子标签下li大于两个且小于 15 个的ul ==count==
xptah = '//ul[count(li)!=2 and count(li) <15]'
- tips:举一反三,还有很多种写法
- 定位所有标签名字以s开头的标签 ==starts-with==
xptah = '//*[starts-with(name(),'s')]'
- tips:注意是标签名字,比如 span 标签,而不是里面的属性
- 定位所有名字中包含 s 的标签 ==contains==
xptah = '//*[contains(name(),'s')]'
- tips:注意是标签名字,比如 span 标签,而不是里面的属性
- 定位所有属性 class 名中不包含 s 的标签 ==contains==
xptah = '//*[not(contains(@class,'s'))]'
- tips:注意是标签名字,比如 span 标签,而不是里面的属性
- tips:不要什么属性,就定位到那个属性,然后加上 not()即可
- 定位所有 class 属性名长度大于 3 的标签 ==string-length==
xptah = '//*[string-length(@class) > 3]'
- tips:这里可以使用大于,小于,等于,大于小于等多种
运算查找
- mod 配合 position() 使用 ==mod 取余计算== ==position 返回当前标签位置==
- 拿到所有li位置在偶数位的标签
xptah = '//li[position() mod 2 = 0 ]'
- 拿到所有li位置在奇数位的标签
xptah = '//li[position() mod 2 = 1 ]'
- 拿到所有li位置除以 2 等于 2 的标签
xptah = '//li[position() div 2 = 2]'