Scrapy框架get() 、getall() 、extract() 、extract_first()的區別

看官方文檔(連接附在文末),看到了關於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 進行測試html

scrapy shell https://gavbus668.com/

獲得以下結果:
命令行運行結果
皆是常規操做python

返回html的前200個字符,看看沒有發生錯誤web

response.text[:200]

獲得:shell

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

html源碼

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對象實例的方法ui

繼續使用get() 、getall() 、extract() 、extract_first(),觀察區別:spa

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()方法

相關文章
相關標籤/搜索