四大選擇器
當我們抓取網頁時,最常見任務就是從HTML源碼中提取數據,可是怎麼提取數據呢?當然就是用選擇器了.
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</div><id>
</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實例
- 查找a標籤下的div標籤的文本:
>>>sel.xpath(‘/html/body/ul/li/a/div/text()’).extract_first()
正則表達式
正則表達式,又稱規則表達式。(英語: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