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開啟同級目錄下的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種選擇器中的一種對其高階語法學習
- 學習和掌握正則表示式的用法
- 嘗試使用高階語法解析一些頁面