路径表达式
- nodename:选取此节点的所有子节点
- /:从当前节点选取直接子节点
- //:从当前节点选取子孙节点
- .:选取当前节点
- …:选取当前节点的父节点
- @:选取属性
/
表示从根节点选取一级一级筛选(不能跳)
选取根节点 html ,可以打印出根节点元素,而选取 body 打印时,是找不到的,这个符号只能从根节点开始找。
page.xpath("/html")
// [<Element html at 0x27107f41100>]
page.xpath("/body")
// []
//
// 表示从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。注意:是所有符合条件的
.
. 表示选取当前标签
先定位到 ul 元素节点,结果是一个列表,然后再打印当前节点列表的第一个 ul,接着我们打印这个 ul 节点的子节点 li。
ul = page.xpath("//ul")
print(ul)
print(ul[0].xpath("."))
print(ul[0].xpath("./li"))
…
… 表示选取当前标签的父节点
print(ul[0].xpath(".."))
@
@ 表示获取标签的属性值
谓语
谓语用来查找某个或某些特定的节点或者包含某个指定值的节点。谓语被嵌在方括号中
//a[n] n为大于零的整数,代表子元素排在第n个位置的<a>元素
//a[last()] last() 代表子元素排在最后位置的<a>元素
//a[last()-] 和上面同理,代表倒数第二个
//a[position()<3] 位置序号小于3,也就是前两个,这里我们可以看出xpath中的序列是从1开始
//a[@href] 拥有href的<a>元素
//a[@href='www.baidu.com'] href属性值为'www.baidu.com'的<a>元素
//book[@price>2] price值大于2的<book>元素
获取文本
text()
我们用text()获取某个节点下的文本:
page.xpath('//ul/li/a/text()')
string()
我们用string()获取某个节点下所有的文本
page.xpath('string(//ul)')
通配符
- *任意元素
page.xpath('//li/*')
- @* 任意属性
page.xpath('//li/@*')
或运算
通过在路径表达式中使用"|"运算符,可以实现选取若干个路径。
page.xpath("//li|//a")
函数
xpath内置很多函数。更多函数查看链接: https://www.w3school.com.cn/xpath/xpath_functions.asp
- contains(string1,string2)
- starts-with(string1,string2)
- text()
- last()
- position()
- node()
contains
有的时候,class作为选择条件的时候不合适@class=’…’ 这个是完全匹配,当网页样式发生变化时,class或许会增加或减少像active的class。用contains就能很方便
page.xpath("//*[contains(@class, 'item-inactive')]")
starts-with
page.xpath("//*[starts-with(@class, 'item-inactive')]")
其他几个函数,在上面使用过。注意,并不是所有的 xpath 函数python都会支持,比如 ends-with(string1,string2) 和 upper-case(string) 就不支持
节点轴选择
ancestor轴
调用 ancestor 轴,获取所有祖先节点。其后需要跟两个冒号,然后是节点的选择器。返回结果:第一个li节点的所有祖先节点。
page.xpath('//li[1]/ancestor::*')
attribute轴
调用 attribute 轴,获取所有属性值。返回结果:li节点的所有属性值。
page.xpath('//li[1]/attribute::*')
child轴
调用 child 轴,获取所有直接子节点。返回结果:选取 href 属性为 link1.html 的 a 子节点
page.xpath('//li[1]/child::a[@href="link1.html"]')
descendant轴
调用 descendant 轴,获取所有子孙节点。返回结果:选取 li 节点下的子孙节点里的 span 节点
page.xpath('//li[4]/descendant::span')
following轴
调用 following 轴,获取当前节点之后的所有节点
page.xpath('//li[4]/following::*[2]')
following-sibling轴
调用 following-sibling 轴,获取当前节点之后的所有同级节点
page.xpath('//li[4]/following-sibling::*')