原文地址:LoveDev
Scrapy提取數(shù)據(jù)有自己的一套機(jī)制目胡。它們被稱作選擇器(seletors),他們通過(guò)特定的 XPath 或者 CSS 表達(dá)式來(lái)選擇HTML文件中的某個(gè)部分渤弛。
XPath
XPath 是一門(mén)在 XML 文檔中查找信息的語(yǔ)言,CSS 是一門(mén)將HTML文檔樣式化的語(yǔ)言葬项,本文主要介紹 XPath
以一個(gè)圖片為例子:
<?xml version="1.0" encoding="UTF-8"?>
<div class="item">
<table class="pic">
<a >
![1](https://img3.doubanio.com/view/movie_poster_cover/ipst/public/p480747492.webp)
![2](https://img3.doubanio.com/view/movie_poster_cover/ipst/public/p2233971046.jpg)
<div>hello, world</div>
</a>
</table>
</div>
節(jié)點(diǎn)
在 XPath 中轻局,有七種類型的節(jié)點(diǎn):元素、屬性挡毅、文本蒜撮、命名空間、處理指令慷嗜、注釋以及根節(jié)點(diǎn)淀弹。XML 文檔是被作為節(jié)點(diǎn)樹(shù)來(lái)對(duì)待的。樹(shù)的根被稱為根節(jié)點(diǎn)庆械。
在上面例子中:
-
div
:根節(jié)點(diǎn) -
table
:元素節(jié)點(diǎn) -
href
:屬性節(jié)點(diǎn)
選取節(jié)點(diǎn)
Expression | Alias |
---|---|
nodename | 選取當(dāng)前節(jié)點(diǎn)下所有子節(jié)點(diǎn) |
/ | 絕對(duì)路徑 |
// | 文檔中所有該節(jié)點(diǎn) |
. | 當(dāng)前節(jié)點(diǎn) |
.. | 父節(jié)點(diǎn) |
@ | 選取屬性 |
是不是很眼熟呢薇溃?和命令行操作很類似
Expression | Alias |
---|---|
div | div下所有子節(jié)點(diǎn) |
/div | div根節(jié)點(diǎn) |
div/table | div子元素中所有table節(jié)點(diǎn) |
//img | 所有img節(jié)點(diǎn) |
div//img | div后代元素中所有table節(jié)點(diǎn) |
//@src | 名為src的所有屬性 |
謂語(yǔ)
謂語(yǔ)用來(lái)查找某個(gè)特定的節(jié)點(diǎn)或者包含某個(gè)指定的值的節(jié)點(diǎn)
Expression | Alias |
---|---|
//img[@alt="1"] | alt值為1的節(jié)點(diǎn)中src屬性的值 |
//a/img[1] | a中子元素的第一個(gè)img元素 |
//a/img[last()] | a中子元素的最后一個(gè)img元素 |
獲取值
Expression | Alias |
---|---|
//img[@alt="1"]/@src | alt值為1的節(jié)點(diǎn)中src屬性的值 |
/div/@class | div根節(jié)點(diǎn)中class屬性的值 |
//a/div/text() | div節(jié)點(diǎn)中的hello, world |
捷徑
偉大的 chrome 已經(jīng)提供了直接復(fù)制 XPath 功能,在開(kāi)發(fā)者工具中右鍵節(jié)點(diǎn)選擇 Copy
-> Copy XPath
缭乘,就可以獲取到 XPath 的絕對(duì)路徑
選擇器
由于在response中使用XPath沐序、CSS查詢十分普遍,因此,Scrapy提供了兩個(gè)實(shí)用的快捷方式:response.xpath()
及 response.css()
:
標(biāo)準(zhǔn)選擇器
# alt屬性值為1的img元素
response.xpath('//img[@alt="1"]')
xpath()
及 css()
返回 SelectorList
類的實(shí)例策幼,這是一個(gè)新選擇器的列表邑时,SelectorList
類是內(nèi)建 list
類的子類,并提供一些額外的方法
Method | Alias |
---|---|
xpath(query) | 結(jié)果為一個(gè)單一化的 SelectorList |
css(query) | 結(jié)果為一個(gè)單一化的 SelectorList |
extract() | 提取真實(shí)的原文數(shù)據(jù)特姐,結(jié)果為單一化的unicode字符串列表 |
re() | 通過(guò)正則表達(dá)式來(lái)提取數(shù)據(jù)晶丘,結(jié)果為單一化的unicode字符串列表 |
nonzero() | 列表非空返回True,否則返回False |
嵌套選擇器
# 包含src屬性唐含,并且src屬性值中包含doubanio字符串的img元素
response.xpath('//img[contains(@src, "doubanio")]')
帶有正則的選擇器
Selector 有一個(gè) .re()
方法浅浮,可以用來(lái)通過(guò)正則表達(dá)式來(lái)提取數(shù)據(jù),例如在 Scrapy學(xué)習(xí)筆記01-初窺 中:
# 獲取 “12345評(píng)論” 中的12345
item['commentsNum'] = sel.xpath('div[2]/div[2]/div/span[4]/text()').re(r'[\d]+')[0]
- 括號(hào)里面的第一個(gè)
r
表示字符串為非轉(zhuǎn)義的原始字符串捷枯,強(qiáng)烈推薦不管有沒(méi)有轉(zhuǎn)義字符都加上