scrapy至少有三種選擇器呕臂,很大很多。理論上學會兩種就夠用了肪跋。
項目組都用一個選擇器最好了歧蒋。
一定要學會正則表達式。
第一種介紹CSS選擇器
標簽成對出現(xiàn)澎嚣。
div疏尿,p不管div和p有什么關系,都搜索出來
div p 選擇div下的所有p元素可以是父子關系也可以是爺孫關系等易桃。
div>p 這個只能是父子關系褥琐。
還有一個函數(shù) extract_first()切片,extract()切片脫殼
脫殼后
選擇器返回的一般都是一個list晤郑,要記住敌呈,我們想要的都是結果文本
而li和a是父子關系贸宏。
示例:
p標簽,li標簽磕洪,a標簽
單獨抽離scrapy選擇器
都是借用什么找到什么吭练。如:借用class=‘top’這個屬性找到li標簽
此時做斷點調試最合適。
輔助斷點測試參考文章:
http://blog.csdn.net/lanchunhui/article/details/49514297
id唯一析显,class不唯一
012代表幾個標簽鲫咽。
xpath寫法
跟文件路徑很像,默認第一層/html谷异,單斜杠就是一層
雙斜杠是搜索的意思分尸,跟css什么都不帶一樣
文本和屬性,屬性是class=‘top’歹嘹,文本是li的div用text()
下圖是屬性寫法
Xpath的使用方法
尋找可以匹配 xpath query 的節(jié)點箩绍,并返回 SelectorList 的一個實例結果,單一化其所有 元素尺上。列表元素也實現(xiàn)了 Selector 的接口材蛛。query 是包含XPATH查詢請求的字符串
該方法可以通過 response.xpath() 調用
選取節(jié)點
Xpath 使用路徑表達式在 XML文檔中選取節(jié)點。節(jié)點是通過沿著路徑或者step來選取的怎抛。
下面列出了最有用的路徑表達式:
[圖片上傳失敗...(image-91e392-1517579430475)]
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()方法提取數(shù)據(jù):
查找a標簽下的div標簽的文本:
sel.xpath(‘/html/body/ul/li/a/div/text()’).extract_first()
RE的使用方法
正則表達式,又稱規(guī)則表達式抽诉。(英語:Regular Expression陨簇,在代碼中常簡寫為regex、regexp或RE)它通常被用來檢索迹淌、替換那些符合某個模式(規(guī)則)的文本权纤。
常用元字符:
[圖片上傳失敗...(image-df6557-1517579430475)]
[圖片上傳失敗...(image-be1293-1517579430475)]
[圖片上傳失敗...(image-a908c-1517579430475)]
匹配神器:
- (.*)具有貪婪的性質遣疯,首先匹配到不能匹配為止,根據(jù)后面的正則表達式,會進行回溯毫别。
- (.*?)則相反踢故,一個匹配以后运挫,就往下進行旗们,所以不會進行回溯,具有最小匹配的性質蔓涧。
pyquery的使用方法
pyquery可以讓你使用類似jQuery語法來對xml進行操作件已,pyquery語法盡可能跟jQuery語法相似 ,類似于css
pyquery使用lxml庫對xml和html進行快速的處理
pyquery這個庫目前還不是一個可以跟JavaScript代碼交互的庫
兼容性好元暴,不用各種脫殼
建議平時用pyquery
提文本篷扩,提屬性
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函數(shù)
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