相关文章推荐
坚韧的啤酒  ·  表达式和函数 - Azure Data ...·  1 月前    · 
坏坏的黑框眼镜  ·  Niagara Launcher 🔹 ...·  9 月前    · 
文武双全的刺猬  ·  猎豹加速器官方版-相关推荐-应用宝官网·  1 年前    · 
任性的抽屉  ·  2017哈佛峰会在杭二中举行 ...·  1 年前    · 
有胆有识的帽子  ·  再关一家!美国第一共和银行被正式接管--国际 ...·  1 年前    · 
眉毛粗的手术刀  ·  构建国家种业企业阵型 ...·  1 年前    · 
Code  ›  xpath进阶用法开发者社区
xpath
https://cloud.tencent.com/developer/article/1447667
唠叨的领结
1 年前
Feffery

xpath进阶用法

腾讯云
开发者社区
文档 建议反馈 控制台
首页
学习
活动
专区
工具
TVP
最新优惠活动
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
Feffery
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
社区首页 > 专栏 > xpath进阶用法

xpath进阶用法

作者头像
Feffery
发布 于 2019-06-18 18:47:33
2.9K 0
发布 于 2019-06-18 18:47:33
举报
文章被收录于专栏: 数据科学学习手札 数据科学学习手札

一、简介

xpath作为对网页、对xml文件进行定位的工具,速度快,语法简洁明了,在网络爬虫解析内容的过程中起到很大的作用,除了xpath的基础用法之外xpath中还存在着非常之多的进阶用法,本文将对笔者日常使用中积累的xpath进阶用法进行总结并举例说明:

二、xpath进阶用法

首先抓取网页源码并利用etree解析:

import requests
from lxml import etree
html = requests.get('http://quotes.toscrape.com/')
tree = etree.HTML(html.text)

2.1 获取某一节点的上一级节点

在xpath中/..表示向上一级,这里我们用xpath按照下图中的路径提取a标签里的内容:

'''提取页面中符合下列位置规则的所有keyword'''
tree.xpath("//meta[@class='keywords']/../a[@class='tag']/text()")

或者利用parent来向上一级跳转,效果是一样的:

'''提取页面中符合下列位置规则的所有keyword'''
tree.xpath("//meta[@class='keywords']/parent::*/a[@class='tag']/text()")

2.2 定位指定属性以某个特定字符开头的标签

在xpath中有函数starts-with(属性名称,开始字符),可用于定位指定属性以某个特定字符开头的标签,如下例,实现与2.1中相同功能:

'''提取href属性以/tag开头的a标签内容'''
tree.xpath("//a[starts-with(@href,'/tag')]/text()")

2.3 定位指定属性值包含特定字符片段的标签

在xpath中函数contains(属性名称,包含字符)可用于定位指定属性值包含特定字符片段的标签内容,比如我们想要找到所有text()内容中带有know的名人名言,就可以像下面这样做:

'''提取text()内容包含know的span标签对应的text()内容'''
tree.xpath("//span[contains(text(),'know')]/text()")

2.4 匹配具有某属性的所有标签

比如说我们想获取页面中所有的href超链接,就可以用下面的方式:

'''获取整个页面内所有href属性'''
tree.xpath("//@href")

2.5 同时定位多个内容

比如说我们想在一行代码里同时取得两种不同的规则下匹配的内容,可以在xpath语句中将不同的多个xpath语句用|连接起来,最终返回的结果在同一个列表里,所以使用这种语法时需要考虑取得的内容是否适合放在一起:

'''同时取得多个定位规则下的内容'''
tree.xpath("//span[contains(text(),'know')]/text() | //span[contains(text(),'world')]/text()")

2.6 选取指定节点下所有子元素

有时候我们想要快捷的获取某一节点下一级所有标签的某一属性内容,可以使用child来表示下一级节点:

'''选取class为quote的div节点下所有span子节点的text()内容'''
tree.xpath("//div[@class='quote']/child::span/text()")

当不指定标签名称而使用*代替时,代表匹配所有子节点:

'''选取class为quote的div节点下所有子节点的text()内容'''
tree.xpath("//div[@class='quote']/child::*/text()")

2.7 选取某一节点所有的属性值

有时候我们想要获取满足条件的节点下所有的属性值:

'''选取class为quote的div标签下所有的属性值'''
tree.xpath("//div[@class='quote']/attribute::*")

也可以指定要提取的具体属性值,如这里我们只提取href,只需要将*替换成href即可:

'''选取class为tag的a标签下所有的href属性值'''
tree.xpath("//a[@class='tag']/attribute::href")

2.8 定位某一节点的祖先节点

比如我们想要获取class为keywords的meta标签之上所有标签的class属性内容,可以像下面这样:

tree.xpath("//meta[@class='keywords']/ancestor::*/@class")

若想同时包含所有祖先节点及自己本身,则可使用ancestor-or-self:

tree.xpath("//meta[@class='keywords']/ancestor-or-self::*/text()")

2.9 定位某一节点的后代节点

类似2.8,只不过这里我们来定位某一节点之下的所有后代节点,使用descendant:

'''获取class为tags的标签下所有后代节点中a标签的href信息'''
tree.xpath("//div[@class='tags']/descendant::a/@href")

2.10 条件与或非

在xpath中使用逻辑运算来定位的方法如下:

与:

'''定位class为text且itemprop为text的span标签'''
tree.xpath("//span[@class='text' and @itemprop='text']/text()")

或:

tree.xpath("//div[@class='quote' or @class='tags']/@class")

非:

'''提取所有span标签class属性不为text的class属性值'''
tree.xpath("//span[not(@class='text')]/@class")

2.11 选取指定标签结束之后的所有指定标签

在xpath中我们可以使用following来定位以某个标签在文档中的位置为起点的所有指定标签:

'''提取所有class为keywords的meta标签结束标签之后出现的标签a的text()内容'''
tree.xpath("//meta[@class='keywords']/following::a/text()")

2.12 选取指定标签开始之前的所有指定标签

与following的功能截然相反,在xpath中使用preceding可以定位指定标签之前的所有标签:

'''选取body标签之前的所有标签的text()内容'''
 
推荐文章
坚韧的啤酒  ·  表达式和函数 - Azure Data Factory & Azure Synapse | Microsoft Learn
1 月前
坏坏的黑框眼镜  ·  Niagara Launcher 🔹 fresh & clean 的使用1年的感受 - 少数派
9 月前
文武双全的刺猬  ·  猎豹加速器官方版-相关推荐-应用宝官网
1 年前
任性的抽屉  ·  2017哈佛峰会在杭二中举行 500多位学生 哈佛40位明星授课人-新闻中心-温州网
1 年前
有胆有识的帽子  ·  再关一家!美国第一共和银行被正式接管--国际--人民网
1 年前
眉毛粗的手术刀  ·  构建国家种业企业阵型 加快打造种业振兴骨干力量 ——农业农村部种业管理司、渔业渔政管理局、全国畜牧总站负责人就《关于扶持国家种业阵型企业发展的通知》答记者问
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号