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

栏目: 编程工具 · 发布时间: 5年前

内容简介:看官方文档(链接附在文末),看到了关于get()、get()方法的使用,查阅网络没有资料,那就自己记录一下。y( ˙ᴗ. )耶~y( ˙ᴗ. )耶~y( ˙ᴗ. )耶~y( ˙ᴗ. )耶~y( ˙ᴗ. )耶~y( ˙ᴗ. )耶~y( ˙ᴗ. )耶~y( ˙ᴗ. )耶~y( ˙ᴗ. )耶~先说结论:

看官方文档(链接附在文末),看到了关于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()方法

以上所述就是小编给大家介绍的《Scrapy框架get() 、getall() 、extract() 、extract_first()的区别》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

算法技术手册(原书第2版)

算法技术手册(原书第2版)

George T. Heineman、Gary Pollice、Stanley Selkow / 杨晨、曹如进 / 机械工业出版社 / 2017-8-1 / 89.00元

本书使用实际代码而非伪代码来描述算法,并以经验主导支撑数学分析,侧重于应用且规范严谨。本书提供了用多种程序设计语言实现的文档化的实际代码解决方案,还介绍了近40种核心算法,其中包括用于计算点集的Voronoi图的Fortune算法、归并排序、多线程快速排序、AVL平衡二叉树实现以及空间算法。一起来看看 《算法技术手册(原书第2版)》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

MD5 加密
MD5 加密

MD5 加密工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具