什么,你还不会xpath高级语法

221 阅读2分钟

随着vue的广泛应用传统的xpath语法已经满足不了日常的html解析工作了,这里总结几种常用xpath高级用法附加说明,亲测可以解决90%+的html解析问题,话不多说进入正题,文末有彩蛋

1.或 语法

'//div[@id="testid"]/h2/text() | //li[@data]/text()'

2.条件判断

u'//h2[text()="文本"]/text()'

3.节点统计

'count(//li[@data])'

4.多条件匹配

'//li[@data="one" or @code="one"]/text()'

5.布尔值(否)

'count(//li[not(@data)])'不包含data属性的li标签统计`

6.html源码还原

s = <Element div at 0x2b6ffc8>
s2 = etree.tostring(s)

7.选取一个属性中的多个值

举例:<div class="mp-city-list-container mp-privince-city" mp-role="provinceCityList">
选择这个div的方案网上有说用and的,但是似乎只能针对不同的属性的单个值
本次使用contains
.xpath('div[contains(@class,"mp-city-list-container mp-privince-city")]')
当然也可以直接选取其属性的第二个值
.xpath('div[contains(@class,"mp-privince-city")]')

8.以..开始

'//li[starts-with(@code,"n")]/text()'starts-with定位属性值以n开头的li元素

9.属性包含值

'//h1[contains(text(),"标题")]'h1内容包含‘标题’字段的节点

10.当前节点之前的所有同级节点

'//div[@id="testid"]/preceding-sibling::div/ul/li[2]/text()'

11.当前节点的开始标签之前的所有节点

'//div[@id="testid"]/preceding::li[1]'

12.当前节点的父节点

'//li[@data="one"]/parent::ul'

13.同父辈元素

'//div[@id="testid"]/namespace::*'

14.父辈元素及当前元素

'//div[@id="testid"]/ancestor::div'所有父辈元素
'//div[@id="testid"]/ancestor-or-self::div'所有父辈元素及当前节点

15.选取文档中当前节点的结束标签之后的所有节点

xpath('//div[@id="testid"]/following::div[not(@id)]/.//li[1]/text()')

国内谷歌插件源极简插件