解析库XPath的语法
学习总结
XPath( XML Path Language),他是在html和xml中查找信息的语言,他是通过标签属性来查询
谷歌安装XPath插件和说明
名称XPath Helper
按Shift+鼠标上下可以调整位置
XPath语法
表达式 | 描述 |
---|---|
// | 查询的父标签,比如//div 就是查询这个页面的全部是div的标签 |
/ | 查询的子标签,比如//div/span 就会叫div 标签下的span 子标签 |
[@xxx] | 指定标签里面属性来查询,比如//div[@class] 就是查询div 标签里面带class 属性的 |
/@xxx | 指定查询的属性内容,比如//a/img/@src 意思就是要a 标签下的img 里面的src 属性的内容,可以用来提取照片 |
. | 当前节点 |
.. | 选取当前节点的父节点 |
//查询的父标签
比如我想查看他的上映日期,他的标签是span
那我语法就可以用//
查询全部的的span
标签里面的内容,
可以看见他会叫全部的span
标签的全部的数据都显示出来了
/查询的子标签
上面的//
他是输出的是全部
我们就可以用/
指定输出里面的子标签
我们可以他的父标签是div
子标签是span
那我们就可以用//
指定父标签/
指定子标签,可以看见下面的查询的结果就少了
语法
1 | //要指定的父标签/要指定的子标签 |
[@xxx]指定查询属性
上面我们看见//
指定父标签/
指定子标签查询的结果还是有点多我们可以通过[@xxx]
指定查询标签里面的属性来查询
可以看下面他有一个property="v:initialReleaseDate"
属性我们就可以通过这个属性来查询了
语法
1 | [@要查询的属性名] |
可以看见这样就搜索出来时间了
1 | //div/span[@property="v:initialReleaseDate"] |
父标签也是可以指定的
比如想要豆瓣成员常用的标签 · · · · · ·
的标签,我们就可以下面这样写
我们就可以这样写
1 | //div[@class="tags-body"]/a # div是父标签 class="tags-body"是父标签的属性 a是子标签 |
@指定查询的属性内容
1 | `//a[class="nbgnbg"]/img/@src` # 意思就是要`a`标签里面有`class="nbgnbg"`属性下的`img`里面的`src`属性的内容 |
XPath表达式
更详细的https://www.w3school.com.cn/xpath/xpath_operators.asp
表达式 | 描述 |
---|---|
[n] | 指定查询我想要的,他这个和列表是一样的比如xxxx[1],这个是从1开始的不是0 |
[last()] | 指定最后一个,一个你查询的结果太多我就想要最后一个就可以用last() |
[position()<n] | 指定前面n 个结果,比如[position()<4] 就是指定输出前面3 个 |
and | 与,比如有一个点不成立就没有显示 |
or | 或,只有有一个成立的就显示那个成立的 |
| | 这个|就是和或者是或,比如`//a |
* | * 代表匹配所有节点 |
[]指定查询我想要的
可以看见的时间有好几个但是我只想要一个怎么办,我们就可以用[]
来指定了,这个是从1开始的不是0
1 | //div/span[@property="v:initialReleaseDate"] |
比如我只想要第一个,我们就可以下面这样写
1 | //div/span[@property="v:initialReleaseDate"][1] |
比如我只想要第三个,我们就可以下面这样写
1 | //div/span[@property="v:initialReleaseDate"][3] |
我们也可以指定父目录比如//div[3]/span[@property="v:initialReleaseDate"]
我就不演示了
他还可以用多个[]
[last()]指定最后一个
[last()]
指定最后一个,一个你查询的结果太多我就想要最后一个就可以用last()
下面我只想要最后一个就可以用last()
1 | //div[@class="tags-body"]/a[last()] |
[position()<n] 指定前面n
个结果
[position()<n] 指定前面n
个结果,比如[position()<4]
就是指定输出前面3
个
比如下面我只想要前面三个结果就可以用[position()<n] 指定前面n
个结果
1 | //div[@class="tags-body"]/a |
1 | //div[@class="tags-body"]/a[position()<4] |
and与
and 与,比如有一个点不成立就没有显示
如果我错一个他就不显示
or或
or 或,只有有一个成立的就显示那个成立的
俩个都正确都显示
如果错一个他也会显示
|和或者是与
这个|就是和或者是或,比如//a | //b
意思是如果他俩都有都匹配,如果只有一个他也会匹配那个有点
测试
1 | //div/span[@property="v:initialReleaseDate"] |
我没有添加|
他会匹配3个
如果我还想在匹配一个那我们就可以添加|
来实现了
1 | //div/span[@property="v:initialReleaseDate"] | //div[@class="tags-body"]/a |
可以看见结果是11个
如果他其中一个是有问题的他也会匹配那个没有问题的这个就是或
1 | //div/spa| //div[@class="tags-body"]/a |
下面这个前面我故意写错可以看见他会匹配后面的