Scrapy框架get() 、getall() 、extract() 、extract_first()的区别

代码拓荒牛
• 阅读 26033

开篇明义:get() 、getall() 是新版本的方法,extract() 、extract_first()是旧版本的方法。

前者更好用,取不到就返回None,后者取不到就raise一个错误。

推荐使用新方法,官方文档中也都改用前者了

看官方文档(链接附在文末),看到了关于get()、get()方法的使用,查阅网络没有资料,那就自己记录一下。
y( ˙ᴗ. )耶~y( ˙ᴗ. )耶~y( ˙ᴗ. )耶~y( ˙ᴗ. )耶~y( ˙ᴗ. )耶~y( ˙ᴗ. )耶~y( ˙ᴗ. )耶~y( ˙ᴗ. )耶~y( ˙ᴗ. )耶~
先说结论:
对于scrapy.selector.unified.SelectorList对象,getall()==extract(),get()==extract_first()
对于scrapy.selector.unified.Selector对象,getall()==extract(),get()!=extract_first()
使用scrapy shell 进行测试

scrapy shell https://gavbus668.com/

得到如下结果:
Scrapy框架get() 、getall() 、extract() 、extract_first()的区别
皆是常规操作

返回html的前200个字符,看看没有发生错误

response.text[:200]

得到:

Out[3]: '<html>rn<head>rn <meta charset="utf-8">rn <meta http-equiv="X-UA-Compatible" content="IE=edge">rn <meta name="renderer" content="webkit">rn <meta name="viewport" content="width=device-widt'

bingo

继续,使用Scrapy Selector下一步操作

Scrapy框架get() 、getall() 、extract() 、extract_first()的区别

In [5]: response.xpath('//*[@id="waterfall"]/div[1]/a/div[2]/span/text()')
Out[5]:
[<Selector xpath='//*[@id="waterfall"]/div[1]/a/div[2]/span/text()' data='DNW-025 彼女が 制服に着替えたら。5'>,
<Selector xpath='//*[@id="waterfall"]/div[1]/a/div[2]/span/text()' data='rntttttt'>,
<Selector xpath='//*[@id="waterfall"]/div[1]/a/div[2]/span/text()' data='rntttttt'>,
<Selector xpath='//*[@id="waterfall"]/div[1]/a/div[2]/span/text()' data=' / '>]
In [10]: type(response.xpath('//*[@id="waterfall"]/div[1]/a/div[2]/span/text()'))
Out[10]: scrapy.selector.unified.SelectorList

发现使用Selector得到的是一个SelectorList对象实例

所以get() 、getall() 、extract() 、extract_first()是SelectorList对象实例的方法

继续使用get() 、getall() 、extract() 、extract_first(),观察区别:

In [6]: response.xpath('//*[@id="waterfall"]/div[1]/a/div[2]/span/text()').get()
Out[6]: 'DNW-025 彼女が制服に着替えたら。5'
In [7]: response.xpath('//*[@id="waterfall"]/div[1]/a/div[2]/span/text()').getall()
Out[7]: ['DNW-025 彼女が制服に着替えたら。5', 'rntttttt', 'rntttttt', ' / ']
In [8]: response.xpath('//*[@id="waterfall"]/div[1]/a/div[2]/span/text()').extract()
Out[8]: ['DNW-025 彼女が制服に着替えたら。5', 'rntttttt', 'rntttttt', ' / ']
In [9]: response.xpath('//*[@id="waterfall"]/div[1]/a/div[2]/span/text()').extract_first()
Out[9]: 'DNW-025 彼女が制服に着替えたら。5'

over,总结一下:
对于scrapy.selector.unified.SelectorList对象
get() == extract_first()
返回的是一个list,里面包含了多个string,如果只有一个string,则返回['我很孤独']这样的形式
getall() == extract()
返回的是string,list里面第一个string

extract_first()与get()有区别与Selector对象有关

In [17]: type(response.xpath('//*[@id="waterfall"]/div[1]/a/div[2]/span/text()'))
Out[17]: scrapy.selector.unified.SelectorList

In [18]: type(response.xpath('//*[@id="waterfall"]/div[1]/a/div[2]/span/text()')[0])
Out[18]: scrapy.selector.unified.Selector

In [19]: response.xpath('//*[@id="waterfall"]/div[1]/a/div[2]/span/text()')[0].get()
Out[19]: 'DNW-025 彼女が制服に着替えたら。5'

In [20]: response.xpath('//*[@id="waterfall"]/div[1]/a/div[2]/span/text()')[0].getall()
Out[20]: ['DNW-025 彼女が制服に着替えたら。5']

In [21]: response.xpath('//*[@id="waterfall"]/div[1]/a/div[2]/span/text()')[0].extract()
Out[21]: 'DNW-025 彼女が制服に着替えたら。5'

In [22]: response.xpath('//*[@id="waterfall"]/div[1]/a/div[2]/span/text()')[0].extract_first()
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-22-9eada5e1e561> in <module>
----> 1 response.xpath('//*[@id="waterfall"]/div[1]/a/div[2]/span/text()')[0].extract_first()

AttributeError: 'Selector' object has no attribute 'extract_first'

In [23]: response.xpath('//*[@id="waterfall"]/div[1]/a/div[2]/span/text()')[0]
Out[23]: <Selector xpath='//*[@id="waterfall"]/div[1]/a/div[2]/span/text()' data='DNW-025 彼女が制服に着替えたら。5'>

发现:对于Selector类型的对象,并不能使用extract_first()方法,而使用get()可以

Scrapy框架get() 、getall() 、extract() 、extract_first()的区别

文末附官方文档链接链接
Scrapy官方教程——关于get()、getall()方法

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Karen110 Karen110
4年前
​一篇文章总结一下Python库中关于时间的常见操作
前言本次来总结一下关于Python时间的相关操作,有一个有趣的问题。如果你的业务用不到时间相关的操作,你的业务基本上会一直用不到。但是如果你的业务一旦用到了时间操作,你就会发现,淦,到处都是时间操作。。。所以思来想去,还是总结一下吧,本次会采用类型注解方式。time包importtime时间戳从1970年1月1日00:00:00标准时区诞生到现在
Stella981 Stella981
3年前
Scrapy框架
\TOC\1\.Scrapy介绍1.1.Scrapy框架Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛。!(http://ccszt.com.cn/python/%E7%88%AC%E8%99%AB/file/images/
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Easter79 Easter79
3年前
SpringMvc接受特殊符号参数被转义
WEB开发时,在前端通过get/post方法传递参数的时候 如果实参附带特殊符号,后端接收到的值中特殊符号就会被转义例如该请求: http://localhost:10001/demo/index.do?name张三(1)注:中文()不会出现此种情况后台就收到的实际name值为:  张三&40;1&41;&40;其实为h
Stella981 Stella981
3年前
Hibernate中get()和load()的区别
Hibernate中根据Id单条查询获取对象的方式有两种,分别是get()和load(),来看一下这两种方式的区别。1\.get()使用get()来根据ID进行单条查询:Userusersession.get(User.class,"1");当get()方法被调用的时候就会立即发出SQL语句:Hiberna
Wesley13 Wesley13
3年前
Hibernate中get和load方法的区别以及close()、clear()、evict()
下边详细说一下get和load的不同,因为有些时候为了对比也会把find加进来。1.从返回结果上对比:load方式检索不到的话会抛出org.hibernate.ObjectNotFoundException异常get方法检索不到的话会返回null2.从检索执行机制上对比:get方法和find方法都是直接从数据库中检索而load
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
代码拓荒牛
代码拓荒牛
Lv1
江汉思归客,乾坤一腐儒
文章
3
粉丝
0
获赞
0