前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >xpath语法简介

xpath语法简介

作者头像
生信修炼手册
发布2020-11-09 11:42:45
9020
发布2020-11-09 11:42:45
举报
文章被收录于专栏:生信修炼手册生信修炼手册

有多种方式可以从网页中提取我们需要的信息,既可以通过正则表达式,也可以使用BeautifulSoup模块。除此之外,xpath表达式也是一种常见用法。

xpath称之为xml路径语言,是一种基于xml的树状结构,来提取特定元素的语言。在python中,最常见的是通过lxml模块来使用xpath, 基本用法如下

代码语言:javascript
复制
>>> from lxml import etree
>>> html = etree.parse("K00001.html", etree.HTMLParser())
>>> html.xpath('/html')

在xml的树状结构中,根节点用/表示,所有的元素都可以作为子节点存在。和linux文件树中相对和绝对定位类似,在xpath中,也有两种定位的写法

1. 绝对定位,用/表示,选取路径树中直接相连的子节点

2. 相对定位,用//表示,表示路径树中所有的子孙节点

同时,一个点号表示当前节点,两个点号表示当前节点父节点的简写方式在xpath中也是适用的。按照以上原则,就可以快速的写出最基础的路径表达式了,以下三种写法是等价的

代码语言:javascript
复制
# 从根节点开始,依次指定路径
>>> html.xpath('/html/head/title')
[<Element title at 0x7f3795bd1d48>]
# 利用//符号,得到属于html标签孙节点的title标签
>>> html.xpath('/html//title')
[<Element title at 0x7f3795bd1d48>]
#  直接用//符号,捕获title标签
>>> html.xpath('//title')
[<Element title at 0x7f3795bd1d48>]

在基础路径的基础上,我们可以通过一些筛选手段进一步对子节点进行限制。xpath的返回结果为一个列表,所以通过方括号运算符来提取子集,经典的用法有以下两种

1. 利用位置筛选

对于多个元素,通过数字下标来选取节点,用法如下

代码语言:javascript
复制
>>> html.xpath('//link')
[<Element link at 0x7f3793a6be88>, <Element link at 0x7f3795b960c8>, <Element link at 0x7f3793a6bf88>, <Element link at 0x7f3793a6b908>]
# 用数字下标提取子集
>>> html.xpath('//link[1]')
[<Element link at 0x7f3793a6be88>]
# 用last函数提取最后一个元素
>>> html.xpath('//link[last()]')
[<Element link at 0x7f3793a6b908>]
# position函数比整数下标加1
>>> html.xpath('//link[position() < 3]')
[<Element link at 0x7f3795b960c8>, <Element link at 0x7f3793a6b9c8>]

2. 利用属性筛选

可以通过指定属性或者属性的值来筛选节点,用法如下

代码语言:javascript
复制
# 筛选包含特定属性的点
>>> html.xpath('//link[@media]')
[<Element link at 0x7f3793a6b9c8>]
# 根据属性值进行筛选
>>> html.xpath('//link[@media = "only"]')
# 逻辑操作,根据多个属性的值进行筛选
>>> html.xpath('//link[@media = "only" and @herf="#"]')

当我们选取出符合条件的节点之后,进一步需要取出该节点的额外信息,通常是包含的文字或者属性值,用法如下

代码语言:javascript
复制
# 获取文本
>>> html.xpath('//title/text()')

# 获取属性值
>>> html.xpath('//a/@href')

通过xpath语法,给我们提供了一种正则和BeautifulSoup之外的一种选择,根据需要,灵活使用这3种策略,可以大大提供处理效率。

·end·

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-11-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信修炼手册 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档