1. 程式人生 > >Scrapy選擇器的用法

Scrapy選擇器的用法

當我們抓取網頁時,最常見任務就是從HTML原始碼中提取資料,可是怎麼提取資料呢?當然就是用選擇器了。本節課主要介紹CSS,Xpath,正則表示式,pyquery四種選擇器。

四大選擇器

Scrapy 提取資料有自己的一套機制。它們被稱作選擇器(seletors),通過特定的 Xpath 、 CSS 表示式或者正則表示式來選擇 HTML 檔案中的某個部分的資料。

我們常用的選擇器有四種:CSS選擇器,Xpath選擇器,正則表示式,pyquery選擇器。Scrapy內建了三種選擇器,分別是CSS選擇器,Xpath選擇器,正則表示式,使用pyquery需要另外安裝pyquery庫

CSS的使用方法

CSS 是一門將 HTML 文件樣式化的語言。選擇器由它定義,並與特定的 HTML 元素的樣式相關聯。在CSS中,選擇器是一種模式,用於選擇需要新增樣式的元素

應用給定的CSS選擇器時,返回 SelectorList 的一個例項,query 是一個包含CSS選擇器的字串 
該方法可以通過 response.css() 呼叫

CSS3選擇器
CSS選擇器使用示例:

我們使用一個自定義的網頁原始碼演示css選擇器的用法

html原始碼如下:

<body> <ul> <li class="top"> <div>li的div</div> </li> <li class="top"> <div
>
<div>li的div的div</div>div> </div> </li> <li> <p>li的p</p> </li> <li> <a> <div id="li_a_div">li的a的div</divid> </a> </li
>
</ul> </body>

開啟同級目錄下的HTML檔案,所獲取的sel變數是Selector變數,可以直接使用sel.css()對其進行選擇:

from scrapy import Selector with open('test.html' , encoding='utf-8') as f: text = f.read() sel = Selector(text=text)

選擇 class='top'的元素

>>>sel.css(‘.top’) 
#可見其返回了一個SelectorList例項

選擇 id='li_a_div'的元素

>>>sel.css(‘#li_a_div’) 
#可見其返回了一個SelectorList例項

選擇所有的元素

>>>sel.css(‘*’) 
#可見其返回了一個SelectorList例項

選擇li元素內部的所有div的元素

>>>sel.css(‘li div’) 
#中間是空格 
#可見其返回了一個SelectorList例項

選擇父元素為li元素的所有div的元素

>>>sel.css(‘li > div’) 
#中間是“>” 
#可見其返回了一個SelectorList例項

選擇所有的div元素和所有的li元素

>>>sel.css(‘li,div’) 
#中間是“,” 
#可見其返回了一個SelectorList例項

想要提取出資料,需要呼叫.extract()方法,比如:

>>> sel.css(“li > div”).extract()


想要直接得到列表中第一個元素,可以呼叫.extract_first()方法,比如:

>>>sel.css(‘li > div’).extract_first()

Xpath的使用方法

尋找可以匹配 xpath query 的節點,並返回 SelectorList 的一個例項結果,單一化其所有 元素。列表元素也實現了 Selector 的介面。query 是包含XPATH查詢請求的字串 
該方法可以通過 response.xpath() 呼叫

選取節點

Xpath 使用路徑表示式在 XML文件中選取節點。節點是通過沿著路徑或者step來選取的。 
下面列出了最有用的路徑表示式:

Xpath選擇器使用示例:

Xpath選擇方法之前在入門課程第四課已學習過了,仍然使用上面的例子: 
查詢ul標籤下的li元素

>>>sel.xpath(‘/html/body/ul/li’) 
#可見其返回了一個SelectorList例項

查詢所有的li標籤

>>>sel.xpath(‘//li’) 
#可見其返回了一個SelectorList例項

查詢第三個li標籤下的第一個p標籤

>>>sel.xpath(‘//li’)[2].xpath(‘./p’)[0] 
#可見其返回了一個SelectorList例項

同樣可以呼叫.extract()方法提取資料: 
查詢a標籤下的div標籤的文字

>>>sel.xpath(‘/html/body/ul/li/a/div/text()’).extract_first()

RE的使用方法

正則表示式,又稱規則表示式。(英語:Regular Expression,在程式碼中常簡寫為regex、regexp或RE)它通常被用來檢索、替換那些符合某個模式(規則)的文字。

常用元字元:

匹配神器:

  • (.*)具有貪婪的性質,首先匹配到不能匹配為止,根據後面的正則表示式,會進行回溯。
  • (.*?)則相反,一個匹配以後,就往下進行,所以不會進行回溯,具有最小匹配的性質。

pyquery的使用方法

pyquery可以讓你使用類似jQuery語法來對xml進行操作,pyquery語法儘可能跟jQuery語法相似 
pyquery使用lxml庫對xml和html進行快速的處理 
pyquery這個庫目前還不是一個可以跟JavaScript程式碼互動的庫

pyquery選擇器使用示例:

開啟同級目錄下的HTML檔案,所獲取的jpy變數是PyQuery,可以直接使用jpy對其進行選擇:

from pyquery import PyQuery with open('test.html' , encoding='utf-8') as f: text = f.read() jpy = PyQuery(text) pass

查詢class=‘top’的元素的文字

>>>jpy(‘.top’).text()

查詢class=‘top’的元素的class屬性

>>>jpy(‘.top’).attr(‘class’)

查詢li標籤下所有的文字

>>>items = jpy(‘li’) 
>>>for i in items.items(): 
>>>···· print(i.text()) 
li的div 
li的div的div 
li的p 
li的a的div

查詢li標籤下所有的class屬性

>>>items = jpy(‘li’) 
>>>for i in items.items(): 
>>>···· print(i.attr(‘class’)) 
top 
top 
None 
None

課後作業:

  • 選4種選擇器中的一種對其高階語法學習
  • 學習和掌握正則表示式的用法
  • 嘗試使用高階語法解析一些頁面