正則表達式取值方法歸納

如,某站點介面請求返回值如下:

{"Code":0,"Msg":"獲取成功","Data":
  {"Total":1,"DataList":
    [{"Id":11564XXXX4368,
     "TopIsAgent":false,
     "IsAnchor":true,
     "FirstTwitterId":1156XXX368,
     "FirstTwitterName":"貝克漢姆",
     "FirstTwitterRemark":"小貝960",
      "FirstTwitterTelephone":"1867XXXX640",
      "IsTwitter":true,
      "HeadImgUrl":"//wx.qlogo.cn/mmopen/vi_32/DYAIOgqXXXXyXXX2ov4UzAxA/132",
      "NickName":"貝克漢姆",
      "Remark":"小貝960",
      "WxRemark":null,
      "Telephone":"1867XXXX640",
      "LastBuyTime":"2021-03-06 11:25:38",
      "Source":1,
      "MemberSourceStr":"小程式授權登錄",
      "TotalPoints":185200,
      "TotalFee":10030866.84,
      "TotalFeeNum":292,
      "SingleFee":34352.283698630136986301369863,
      "CustomerType":"會員",
    "Tags":[{"Id":11668,"Name":"規格","TagType":2}],
      "SystemTagType":"成交客戶",
      "Cards":[{"Id":987,"Name":"會員卡測試會員卡測"}],
      "CustomerTime":"2019-07-25 13:59:28","IsExistBlackList":false}]},
      "TraceFlag":null,"ErrorDetail":null,"Pname":null}

 

案例1:直取法取”NickName”後的值」貝克漢姆「,但是輸出會帶「 」雙引號,value = eval(value)可去掉引號

value = re.findall('"NickName":(.*?),', response, re.S)[0]

或者直接在程式碼中把引號去除

value = re.findall('"NickName":」(.*?)「,', response, re.S)[0]

 

案列2:前後匹配法取”NickName”後的值」貝克漢姆「,經觀察,」貝克漢姆「值前面為FirstTwitterName”:”「,後面為”FirstTwitterRemark,則表達式可寫成如下

value = re.findall('FirstTwitterName":"(.+?)","FirstTwitterRemark', response, re.S)[0]

同理,也可以取出HeadImgUrl參值網址中的任意一段內容,如取」wx.qlogo.cn「,寫法如下

value = re.findall("//(.+?)/mmopen", response, re.S)[0]

 爬蟲中經常要取」href「里的內容,也可以通過案例2中的前後匹配法取值,如取下圖html內的href內容,但是要注意中間的空格、換行字元

 

 這裡面我們看不到任何空格和換行字元,但如果先取出class=」tal「內的數據,就可以看的出來了,寫法如下

value = re.findall('<td class="tal" id="">(.+?)</td', response, re.S)

 

 返回內容,可見href前有\r\n,還有空格等數據,所以基於這些數據,把正則再完善一下

value = re.findall('<td class="tal" id=""> \r\n\r\n\t\r\n\r\n\t<h3><a href="(.+?)" target=', response, re.S)

如此,便取出了想要的數據

 

案例3:如果返回值內即包含中文又包含數字,我們只需要數字或者中文呢?如”FirstTwitterRemark”:”小貝960″,取出960或者小貝

首先,取出數字

value = re.findall('"FirstTwitterRemark":"(.*?)",', response, re.S)[0]
num = re.sub(r'\D', "", value)
print(value)
print(num)

 

 

 然後,取出中文

value = re.findall('"FirstTwitterRemark":"(.*?)",', response, re.S)[0]
zhong = re.findall('[\u4e00-\u9fa5]+', value)
print(value)
print(zhong[0])

 

 

 如上,取中間,是通過寫入漢字的unicode範圍來取值,那麼替換成下表格內諸如數字和字母的範圍,同理也可以取出對應的內容

 

未完待續。。。