scrapy框架Selector提取數據

從頁面中提取數據的核心技術是HTTP文本解析,在python中經常使用的模塊處理:css

  BeautifulSoup  很是流行的解析庫,API簡單,但解析的速度慢。html

  lxml 是一套使用c語言編寫的xml解析庫,解析速度快,API相對比較複雜。python

Scrapy中的Selector類是基於lxml庫創建的,而且簡化了API接口。在使用的過程當中先使用xpath或者css選擇器選中頁面中要提取的數據,而後進行提取。正則表達式

提取數據函數

調用Selector或者SelectList對象的如下幾種方法可將選中的內容進行提取spa

  extract()   返回選中內容的Unicode字符串。翻譯

  extract_first()   SelectorList專有,返回其中第一個Selector對象調用extract方法。一般SelectorList中只含有一個Selector對象的時候選擇調用該方法。code

  re()    使用正則表達式來提取選中內容中的某部分。xml

    舉個例子htm

      selector.xpath('.//b/text()') .extract           #[‘價格:99.00元’,‘價格:88.00元’,‘價格:88.00元’]

      selector.xpath('.//b/text()').re('\d+\.\d+')       #[ '99.00','88.00','88.00']

  re_first()   返回SelectorList對象中的第一個Selector對象調用re方法。

      selector.xpath('.//b/text()').re_first('\d+\.\d+')   # '99.00'

 

實際的開發過程當中,幾乎不須要手動建立Selector對象,,Response對象以自身參數自動建立Selector對象

       response.xpath('.//h1/text').extract()        # [ 'song','shi','chao']

       response.css('li::text').extract()                # [ 'song','shi','chao']

xpath選擇器

  xpath即xml路徑語言,用來肯定xml文檔中某個部分的語言,xml文檔(html屬於xml)是一系列節點構成的樹。

基礎語法

    選中文檔的根   描述一個從根開始的絕對路徑   ./表示從當前節點選取 (好比提取了一部分,還須要從提取出來裏面進行提取就會使用,若是不加 會從整個文檔中開始提取)

.      選中當前節點    用來描述相對路徑

..     選中當前節點的父節點  用來描述相對路徑

ELEMENT    選中子節點中全部的ELEMENT元素節點      

//ELEMENT   選中子孫節點中全部的ELEMENT元素節點   

     選中全部元素子節點

text()   選中全部文本子節點

@ATTR  選中名爲ATTR的屬性節點

@*  選中全部的屬性節點

[謂語]  謂語用來查找某個特定的節點或者包含某個特定值的節點

 

舉例

  response.xpath('/html/body/div') #選取body下的全部div

  response.xpath('//a')  #選中文檔全部a

  response.xpath('/html/body//div') #選中body下的全部節點中的div,不管在什麼位置

  response.xpath('//a/text()') #選取全部a的文本

  response.xpath('/html/div/*') #選取div的全部元素子節點

  response.xpath('//div/*/img') #選取div孫節點的全部img

  response.xpath('//img/@src') #選取全部img的src屬性

  response.xpath('//a[1]/img/@*') #選取第一個a下img的全部屬性

  response.xpath('//a[2]') #全部a中的第2個

  response.xpath('//a[last()]') #全部a中的最後一個  ('/a[last()-1]')#倒第二個   ('//a[position()<=3]')#使用position函數選中前三個 ('//div[@id]')#選中全部含有id屬性的div  ('//div[@id="song"]')#選中全部id屬性爲song的div

  response.xpath('//p[contains(@class,'song')]') #選擇class屬性中含有‘song’的p元素

  response.xpath('//div/a | //div/p') 或者,頁面中多是a多是p

 

css選擇器

  css即層疊樣式表,選擇器不如xpath強大,原理就是選擇的時候翻譯成xpath表達式在調用xpath方法。

*        選擇全部節點

#container         選擇id爲container的節點

.container          選擇class包含container的節點

 li a    選擇 全部 li 下的全部 a 節點

ul + p  選擇全部ul後面的第一個p元素

#container > ul    選擇id爲container的第一個ul節點

a[class]   選取全部有class屬性的a元素

a[href="http://b.com"]   含有href="http://b.com"的a元素

a[href*='job']   包含job的a元素

a[href^='https']  開頭是https的a元素

 a[href$='cn']   結尾是cn的a元素

 

response.css('div a::text').extract()   全部div下全部a的文本

response.css('div a::attr(href)').extract()          href的值

response.css('div>a:nth-child(1)')  選中每一個div的第一個a      > 會設定只在子節點中找,不會到孫節點中

response.css('div:not(#container)')  選取全部id不是container的div

response.css('div:first-child>a:last-child')  第一個div中最後一個a

相關文章
相關標籤/搜索