編寫scrapy爬蟲,處理items相關元素數據,涉及到selector, 整理備查。
目錄
一、常用xpath使用方法
二、css語法
三、xpath選擇器整理
四、css選擇器整理
一、常用xpath使用方法:
xpath常用語法
/:根節點
//xxx/zzz:路徑
//div:去全局的子孫中找所有的div元素
.//表示去當前對象的子孫中找
/xxx//div:去兒子對象中找xxx節點下所有的div元素
*:匹配任意節點元素
/html/body/div[1]:選取body下的第一個div節點
//div[@class="xxx"]:選取class屬性爲xxx的div節點
//@attr:獲取attr對應的值
常用函數
text():提取文本信息,//*[@class='xxx']/text()
position():選取第幾個節點,//*[position()=1]
last():選取最後一個節點,//*[last()]
starts-with(@attr,substr):attr屬性值開頭substr的節點
contains(@attr,substr):attr屬性值是否包含substr
運算符
|:計算兩個節點集合,比如//div|//li
比較運算符=,!=,<=...,比如//price[text()>10]
算數運算符:+,-,*,div,比如//price[text()+1]
邏輯運算符:or,and,[@class='xxxx' or @class='yyyy']
xpath語法案例:以取a標籤爲案例,div、span等都相同
xpath('//a'):找到全局中所有的a標籤
xpath('//a/text() '):獲取a標籤的文本值
xpath('//a/span'):a標籤對象兒子下的span標籤
xpath('//a[2]'):a標籤找到後,返回的是一個列表,[n]列表的n位置的值
xpath('//a[@id]'):找全局中屬性爲id的a標籤
xpath('//a[@id="i1"]'):找全局中屬性id爲i1的a標籤
xpath('//a/@id'):取a標籤的id的屬性值
xpath('//a[@href="link.html"][@id="i1"]'):兩個[]代表雙條件,需要href="link.html“,且id="i1"的a標籤
xpath('//a[contains(@href, "link")]'):a標籤的href需要包含"link"字符
xpath('//a[starts-with(@href, "link")]'):a標籤的href需要以"link"開頭
xpath('//a[re:test(@id, "i\d+")]'):正則表達式的寫法,需要有re:test
xpath('//a[re:test(@id, "i\d+")]/@href').extract(),正則表達式的寫法案例
xpath(.//)在當前基礎上往下找,需要加“.”,比如用在for循環中
obj.extract()#列表中的每一個對象轉化字符串==>返回一個列表
obj.extract_first() #列表中的每一個對象轉化字符==>列表中的第一個元素
xpath('/html/body/ul/li/a/@href').extract():一層層去找標籤
二、css語法
基本語法
.classvalue:選擇class屬性爲classvalue的元素
#idvalue:選擇id值爲idvalue的元素
p:選擇所有的p元素
div,p:選擇所有的div和p元素
div~p:前面有div元素的每個p元素,div和p爲兄弟節點
li span :選擇li內部所有的span元素
div>p:選擇父結點爲div的所有p元素
::text/::attr(src):文本信息/提取某個屬性的值,比如a::attr(href),提取超鏈接
屬性的語法
[attr]選擇所有帶attr屬性的元素
[attr=val]選擇attr值爲val的所有元素:[numvalue=num1]
[attr^=val]選擇attr屬性值以val開頭的元素:[src^=http]
[attr$=val]選擇attr屬性值以val結尾的元素:[src^=.jpg]
[attr*=val]選擇attr屬性值包含val的元素:[src*=douban]
ele語法
ele:first-of-type:所有子元素爲ele的第一個元素
ele:first-child:第一個元素爲ele的元素
ele:only-of-type:類型爲ele的元素
ele:only-child:唯一子元素的每個ele元素
ele:nth-of-type(n):選擇第n個ele元素
ele:nth-child(n):第n個子元素爲ele的元素
ele:last-child:最後一個爲ele的子元素
三、xpath選擇器整理
表達式 | 說明 |
---|---|
article | 選取所有article元素的所有子節點 |
/article | 選取根元素article |
article/a | 選取所有屬於article的子元素的a元素 |
//div | 選取所有div子元素(不論出現在文檔任何地方) |
article//div | 選取所有屬於article元素的後代的div元素,不管它出現在article之下的任何位置 |
//@class | 選取所有名爲class的屬性 |
/article/div[1] | 選取屬於article子元素的第一個div元素 |
/article/div[last()] | 選取屬於article子元素的最後一個div元素 |
/article/div[last()-1] | 選取屬於article子元素的倒數第二個div元素 |
//div[@lang] | 選取所有擁有lang屬性的div元素 |
//div[@lang='eng'] | 選取所有lang屬性爲eng的div元素 |
/div/* | 選取屬於div元素的所有子節點 |
//* | 選取所有元素 |
//div[@*] | 選取所有帶(任意)屬性的div元素 |
/div/a | //div/p | 選取所有div元素的a和p元素 |
//span | //ul | 選取文檔中的span和ul元素 |
article/div/p | //span | 選取所有屬於article元素的div元素的p元素以及文檔中的所有span元素 |
//div[@id='1']/h1/text() | 獲取id爲1的div標籤下的h1標籤裏的內容 |
//span[not(@class)] | 選擇不包含class屬性的span節點 |
//span[not(@class) and not(@id)] | 選擇不包含class和id屬性的span節點 |
//span[not(contains(@class,'expire'))] | 選擇不包含class="expire"的span |
//span[contains(@class,'expire')] | 選擇包含class="expire"的span |
//h2[contains(text(),'Activated')] | 選擇標籤內容裏包含Activated的h2標籤 |
//div[not(contains(text(),'activated'))] | 選擇標籤內容中不包含activated的div標籤 |
XPATH如何選擇不包含某一個屬性的節點
我們知道選擇包含某一特定屬性的節點,可以使用例如//tbody/tr[@class]來選擇。那麼不含某屬性的節點如何用xpath取得呢?
這裏可以用到not。例如排除一個屬性的節點可以使用//tbody/tr[not(@class)]來寫,排除一個或者兩個屬性可以使用//tbody/tr[not(@class or @id)]來選擇。
四、css 選擇器整理
表達式 | 說明 |
---|---|
* | 選擇所有節點 |
# container | 選擇id爲container的節點 |
.container | 選取所有class 包含container的節點 |
li a | 選取所有li下的所有a節點 (子節點) |
ul + p | 選擇ul後面的第一個p元素(兄弟節點) |
div#container > ul | 選取id爲container的div的第一個ul子元素 |
ul ~ p | 選取與ul相鄰的所有p元素 |
a[title] | 選取所有有title屬性的a元素 |
a[href="a.com"] | 選取所有href屬性爲a.com值的a元素 |
a[href*="a"] | 選取所有href屬性包含a的a元素 |
a[href^="http"] | 選取所有href屬性值以http開頭的a元素 |
a[href$=".jpg"] | 選取所有href屬性值以.jpg結尾的a元素 |
inupt[type=radio]:checked | 選取狀態爲選中的radio元素 |
div:not(#container) | 選取所有id不爲container的div元素 |
li:nth-child(3) | 選取第三個li元素 |
tr:nth-child(2n) | 第偶數個tr元素 |