最讓人頭疼的清洗資料過程----選擇合適的方式快速命中所需的資料
當我們解析網頁後,往往面對繁雜的原始碼而無從下手,有時候明明知道我們想要的資料就在裡面,可是應該如何把冗餘的部分去除而只保留我們想要的那一個部分呢
在這裡和大家一起學習一下選擇的方法
1、正則表示式
真的是無奈之舉的時候才會想到要去正則,因為它除非格式標準,否則每次搜尋都要重新的繪製pattern
在python中一般匯入re模組
那麼最常用的就比如說 re,findall(匹配的模板,匹配的物件)[0]
匹配的模板中基本上就是r'<title>(.*?)<title>'
模板的基本上就是你抓到的原始碼,你可以把它賦值給變數
.*?是萬能匹配,如果加上括號就是選中其中內容儲存下來
配合w3c理解:
2、xpath
開啟f12,在相應的地方我們點選,右鍵後copy,選擇xpath路徑
基本上需要以下的模組
from parsel import Selector
import requests
z = requests.get('網址')
看一下z.text有沒有我們要的內容
sel = Selector(text = z.text)
sel.xpath('//div[]@class= "content"]/span/text()').extract_first()
//代表的是開頭是絕對路徑,而/則是按順序下來
@後面跟的是屬性,一般是herf src什麼的
比如sel.xpath('//@href').extract()
'//comment()'一般就是用來獲取註釋
p = getxpath(sample原始碼)
那麼遇到一行中跳段的資料怎麼辦?
p.xpath('//li[position() = 1]'/text()').extract()
.xpath('//li[1]'/text()').extract()
奇數偶數位
.xpath('//li[position() mod2= 1]'/text()').extract()
.xpath('//li[position() mod2= 0]'/text()').extract()
最後一個
.xpath('//li[last()]'/text()').extract()
子節點有a的
.xpath('//li[a]'/text()').extract()
子節點有a或h2的
.xpath('//li[a or h2]'/text()').extract()
子節點有a和h2的
.xpath('//a/text()|//h2/text()').extract()
a下herf以https開始
//a[starts-with(@href,"https")]/text()
還有
//a[@href="https......")]/text()
//li/a[@id="begin")]/text()
//li/a[text()= "....")]/text()這個其實就是本身
//li[2]/a[text()= "....")]/@herf這個就是滿足了文字內容的herf的內容爬取了其中取第二個li裡面的滿足text的定位的herf
總結下來就是基本上[]裡面定位,後面再加上/和要找的名字
找p下面所有的文字(包括那些加粗的什麼的)
'string(//.........)'
找class中有content的
.xpath(('//*[contains(@class,"content")]'/text()')).extract()
也可以混入正則、css
.xpath(('//*[contains(@class,"content")]'/text()')).re.('[a-c]').extract()
.xpath(('//*[contains(@class,"content")]'/text()')).css.(.......).extract()
。。。
3.css
舉例 s4.css('.content-a(類名)::text').extract()
對於<p id="xxx" href = python>sssssss<p>
則s4.css('#xxx::attr(herf)')就得到了['python']
其中xxx是標籤,而attr裡面是要獲取的屬性
要點是 class是點,id是#,屬性是attr
你也可以嘗試著將選擇器結合起來
s4.css('p#xxx).xpath('text()').extract()
s4.css('p#xxx).xpath('text()').re.('\w+')