引言
我們之前介紹了Beautiful Soup、pyquery以及正則表達式來提取網頁數據,這確實十分方便。而Scrapy還提供了自己的數據提取方法,即Selector(選擇器)。Selector是基於lxml來構建的,支持Xpath選擇器、CSS選擇器以及正則表達式,功能全面,解析速度和準確度非常高。本節我們將介紹Selector的用法。
直接使用
Selector是一個可以獨立使用的模塊。我們可以直接利用Selector這個類來構建一個選擇器對象,然後調用它的相關方法如xpath( )、css( )等來提取數據。
例如,針對一段HTML代碼,我們可以用如下方式構建Selector對象來提取數據:
運行結果如下:
我們在這裡沒有在Scrapy框架中運行,而是把Scrapy中的Selector單獨拿出來使用了,構建的時候傳入text參數,就生成了一個Selector選擇器對象,然後就可以像前面我們所用的Scrapy中的解析方式一樣,調用xpath( )、css( )等方法來提取了。
在這裡我們查找的是原始碼中的title中的文本,在Xpath選擇器最後加text( )方法就可以實現文本的提取了。
以上內容就是Selector的直接使用方法。同Beautiful Soup等庫類似,Selector其實也是強大的網頁解析庫。如果方便的話,我們也可以在其他項目中直接使用Selector來提取數據。
接下來,我們用實例來詳細講解Selector的用法。
Scrapy shell
由於Selector主要是與Scrapy結合使用,如Scrapy的回調函數中的參數response直接調用xpath( )或者css( )方法來提取數據,所以在這裡我們藉助Scrapy shell來模擬Scrapy請求的過程,來講解相關的提取方法。
我們用官方文檔的一個樣例界面來作為我們的演示:
接著我們就可以開啟Scrapy shell,在命令行輸入如下命令:
scrapy shell + 網址
這樣我們就進入到了scrapy shell模式。這個過程其實是,Scrapy發起了一次請求,請求的URL就是剛才命令行下輸入的URL,然後把一些可操作的變量傳遞給我們,如request、response等,如下所示:
我們可以在命令行模型下輸入命令調用對象的一些操作方法,回車之後實時顯示結果。這與Python命令行交互模式是類似的。
接下來,演示的實例都將頁面的源碼作為分析目標,頁面源碼如下所示: