Python爬蟲學習記錄——11.Scrapy選擇器的用法

四大選擇器

當我們抓取網頁時,最常見任務就是從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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章