Python爬虫的XPath表达式

路径表达式

  • 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::*')
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值