1. 程式人生 > >最讓人頭疼的清洗資料過程----選擇合適的方式快速命中所需的資料

最讓人頭疼的清洗資料過程----選擇合適的方式快速命中所需的資料

當我們解析網頁後,往往面對繁雜的原始碼而無從下手,有時候明明知道我們想要的資料就在裡面,可是應該如何把冗餘的部分去除而只保留我們想要的那一個部分呢

在這裡和大家一起學習一下選擇的方法

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+')