【实例讲解】Python利用parsel模块解析成xpath后的匹配语法

引入:

        python爬虫中经常会用到的解析模块之一就是parsel了,在parsel中,我们可以将请求后的字符串格式解析成xpath,进行内容的匹配,为了熟悉这其中xpath的语法,我们准备对DATA.GOV.HK中有关environment的公开数据集标题进行爬取。

一、【准备】导入数据所在页面的html内容

        明确我们的目标,在DATA.GOV.HK官网中,我们需要找到的是含有所有数据集标题的页面,刚好从它的顶栏中的data目录下面,我们可以点击进入datasets页面。

         进入datasets页面后,可以直接看到所有的数据集标题,在左侧有关于数据种类的筛选栏【Data Categories】,我们选择目录下方的【environment】之后,页面会自动刷新,新加载的页面就是本次爬虫所需要的html内容啦!

         很显然,我们的url地址也变成了https://data.gov.hk/en-datasets/category/environment?order=popularity&file-content=no

        悄咪咪说一句,这个链接也太友好了吧(dddd),想要别的种类数据的直接把category/后面的名称改掉就可以。

        导入html内容


url = 'https://data.gov.hk/en-datasets/category/environment?order=name&file-content=no'
#接收请求页面的html内容
rp = requests.get(url)

二、parsel模块的安装与使用

       1、安装 (win10系统)

pip install parsel

        2、使用

import parsel

                使用parsel解析html页面,创建一个parsel.Selector对象

sel = parsel.Selector(rp.text)

三、xpath匹配

        1、了解parsel中如何使用xpath匹配

 sel.xpath('xpath语法/text()').getall() #text()-获取节点下的文本内容,getall()-获取所有

        2、xpath语法 (xpath路径的写法)

表达式描述
nodename选取此节点的所有子节点
/从根节点选取
//可越多级,从当前节点匹配html中的所有符合的节点
.选取当前节点
..选取当前节点的父节点
@选取属性

        为了搞清楚表格中的表达式如何写出定位到所需的xpath路径,我们先来分析一下页面源代码。

         清楚看到,所有的datasets的简介,都被每一个div[@class='dataset-item']所生成,我们观察其中一个中它的子孙节点可以发现,在/h3[@class='dataset-heading']这里有一个子节点:<a>节点,恰好里面的文本就是了我们想要的标题名称,只要利用xpath定位到所有属性为的<a>节点即可。(小技巧:页面中h3节点只存在于属性为class='dataset-item'中时,我们便可以直接把根节点设置为h3)

         实现语句:

sel.xpath('//h3[@class="dataset-heading"]/a/text()').getall()

                分析以上语句中的xpath语法:

        //h3   #定位到所有标签名为h3的元素

        //h3[@class=''dataset-heading'']  #定位到所有标签名为h3且属性名为dataset-heading的元素,必须是双引号

        //h3[@class=''dataset-heading'']/a  #定位到所有标签名为h3且属性名为dataset-heading的元素的元素名为a的子节点

                这时肯定会有疑问了,为啥可以打个中括号??别急,我们来打印结果看看先。

        我们可以看到,实际上,xpath解析的结果会以列表的形式返回,这也就默许了xpath语法可以结合列表属性,对节点查找的内容进行修改。

路径写法结果
/父节点/子节点[1]选取属于父节点中子元素的第一个子元素
/父节点/子节点[last()]选取属于父节点中子元素的最后一个子元素
/父节点/子节点[position()]选取最前面的两个属于父节点的子元素
//元素名[@属性名]选取拥有该属性名的所有元素
//元素名[@属性名=“x”]选取拥有值为x的属性的所有元素   
/父节点/子元素名[某孙元素>u]/另一个孙元素选取所有某孙元素大于u的父节点下子元素的另一个孙元素

      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值