Scrapy 选择器使用

Scrapy 选择器使用



前言

在编写不同爬虫时我们使用Beautiful Soup,pyquery,正则等对数据进行提取,他们很方便实用。但是在Scrapy中,他也是提供了内置选择器的,下面我们来学习一下。


一、使用解析器

在scrapy中我们想要对提取的数据进行调试,也就是判断提取内容是否正确,我们可以使用scrapy提供的交互式命令行 scrapy shell
本次我们以古诗文网作为案例进行测试,获取其中古诗文部分内容。
在终端我们输入scrapy shell https://www.nulog.cn/mingju/
之后特就会自动下载网页并返回response,我们可以对其进行操作。

二、Xpath选择器

1.用法

scrapy中的xpath和普通xpath用法一样,这里列举几个常用的规则

表达式描述
节点名称选取此节点的所有子节点
/从当前节点选取直接子节点
//从当前节点选取子孙节点
.选取当前节点
选取当前节点的父节点
[@属性=“属性值”]选取属性
text()文本获取
@属性属性获取

2.实例

首先我们在浏览器的检查界面,找到我们需要的数据的位置
位置
通过图片我们可以看到已经出现了我们想要的内容,接下来我们对其进行提取

我们先分步进行,每一步完成我们可以输出看一下返回的是什么:
#1.选择整个内容框,利用器class属性进行匹配
res = response.selector.xpath('//ul[@class="mingju"]')
res输出:[<Selector xpath='//ul[@class="mingju"]' data='<ul class="mingju">\r\n<li>\r\n<h3><a hre...'>]

#2.接下来按照html的结构关系找到具体内容的标签
res2 = res.xpath('./li/h3/a')
res2输出:[<Selector xpath='./li/h3/a' data='<a href="/juzi/5674.html" target="_……bl...'>,……]

#3.上一步中我们已经选取了包含内容的直接节点,接下来我们就要取到其中的内容
res3 = res2.xpath('./text()')
res3输出:[<Selector xpath='./text()' data='清水出芙蓉,天然去雕饰'>,
 <Selector xpath='./text()' data='西施越溪女,出自苎萝山'>,……]

#4.第三步中我们发现结果还是SelectorList类型,并不是纯内容,我们使用getall()方法获取
res4 = res3.getall()
res4输出:['清水出芙蓉,天然去雕饰','西施越溪女,出自苎萝山',……]
#假如我们只想获取第一个内容,还提供给我们另一个方法get()
res5 = res3.get()
res5输出:'清水出芙蓉,天然去雕饰'

接下来我们将以上步骤合并一步提取
res=response.xpath('//ul[@class="mingju"]/li/h3/a/text()').getall()

上面我们就完成了使用xpath进行提取的过程。

注意:如果仔细观察,会发现上面代码中我们使用response.selector.xpath()和response.xpath()效果是一样的。的确如此,两种效果相同,后者是scrapy给我们提供的前者的快捷方式,方便实用。下面的css选择器同理,今后为了方便,将统一使用后者。

三、CSS选择器

1.用法

表达式描述
节点名直接选取该节点
::text获取文本
::attr(属性名)获取属性
[属性=“属性值”]匹配属性

2.实例

还是上面的例子

#1.找到响应的结点
res = response.css('ul[class="mingju"] li h3 a')

#2.获取文本
res2 = res.css('::text')

#3.提取内容
res3 =res2.getall()

#一步完成
res = response.css('ul[class="mingju"] li h3 a::text').getal
l()

四、re匹配

加入我们提取的文本还不满足要求我们可以利用正则继续提取,类似于get()和getall(),有re()re_first().需要注意的是response不能直接调用,需要配合xpath和css

#取上半句
#搭配css,
res = response.css('ul[class="mingju"] li h3 a::text').re('(.*?),.*?')
#搭配xpath
res=response.xpath('//ul[@class="mingju"]/li/h3/a/text()').re_first('(.*?),.*?')

五、嵌套使用

选择器之间可以嵌套使用

res = response.xpath('//ul[@class="mingju"]').css('li h3 a::te
xt').re('(.*?),.*?')


总结

以上便是选择器的用法,日后我们将使用他们对数据进行提取,大大提高我们的效率。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不一样的鑫仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值