盤點一道Python網絡爬蟲中使用正則表達式匹配字符的題目
大家好,我是Python進階者。
一、前言
大家好,我是Python進階者。前幾天在Python交流群里邊有個叫【Arkham】的粉絲問了一個小問題。
一開始還是覺得挺奇怪的,瞅著這個格式十分像是json格式,直接用json提取不香么,但是后來發(fā)現(xiàn)就是這么個格式,而且硬是要提取這個里邊的文本信息。
二、思路
一般的,針對文本提取,正則表達式是首選,十分是方便快捷。
這里給出了兩個方法,感謝【??(這是月亮的背面)】和【數據分析新手-瑜亮】兩位大佬提供的思路。
三、項目實現(xiàn)
這里給大家安排兩種方法,一起來看看吧!文本信息就放這里,大家回頭拿到也可以嘗試練練手。
Top2 26
Top2 "word":"經紀人不得為假唱假演奏提供條件"
Top2 "query":"經紀人不得為假唱假演奏提供條件"
Top2 "show":[]
Top2 "desc":"18日,文旅部發(fā)布關于《演出經紀人員管理辦法(征求意見稿)》公開征求意見的公告。征求意見稿指出,演出經紀人員不得為演員假唱、假演奏提供條件。"
Top2 "img":"https://fyb-1.cdn.bcebos.com/fyb-1//5b4bc1de60744e69f34225af1452a395"
Top2 "url":"https://www.baidu.com/s?wd=%E7%BB%8F%E7%BA%AA%E4%BA%BA%E4%B8%8D%E5%BE%97%E4%B8%BA%E5%81%87%E5%94%B1%E5%81%87%E6%BC%94%E5%A5%8F%E6%8F%90%E4%BE%9B%E6%9D%A1%E4%BB%B6&rsv_dl=fyb_news"
Top2 "rawUrl":"https://www.baidu.com/s?wd=%E7%BB%8F%E7%BA%AA%E4%BA%BA%E4%B8%8D%E5%BE%97%E4%B8%BA%E5%81%87%E5%94%B1%E5%81%87%E6%BC%94%E5%A5%8F%E6%8F%90%E4%BE%9B%E6%9D%A1%E4%BB%B6"
Top2 "hotScore":"2325661"
Top2 "hotChange":"same"
Top2 "hotTag":"0"
Top2 "appUrl":"https://www.baidu.com/s?wd=%E7%BB%8F%E7%BA%AA90%E4%BE%9B%E6%9D%A1%E4%BB%B6&rsv"
1、正則表達式
這個方法十分奏效,代碼如下。
# -*- coding: utf-8 -*-
import re
text = """
Top2 26
Top2 "word":"經紀人不得為假唱假演奏提供條件"
Top2 "query":"經紀人不得為假唱假演奏提供條件"
Top2 "show":[]
Top2 "desc":"18日,文旅部發(fā)布關于《演出經紀人員管理辦法(征求意見稿)》公開征求意見的公告。征求意見稿指出,演出經紀人員不得為演員假唱、假演奏提供條件。"
Top2 "img":"https://fyb-1.cdn.bcebos.com/fyb-1//5b4bc1de60744e69f34225af1452a395"
Top2 "url":"https://www.baidu.com/s?wd=%E7%BB%8F%E7%BA%AA%E4%BA%BA%E4%B8%8D%E5%BE%97%E4%B8%BA%E5%81%87%E5%94%B1%E5%81%87%E6%BC%94%E5%A5%8F%E6%8F%90%E4%BE%9B%E6%9D%A1%E4%BB%B6&rsv_dl=fyb_news"
Top2 "rawUrl":"https://www.baidu.com/s?wd=%E7%BB%8F%E7%BA%AA%E4%BA%BA%E4%B8%8D%E5%BE%97%E4%B8%BA%E5%81%87%E5%94%B1%E5%81%87%E6%BC%94%E5%A5%8F%E6%8F%90%E4%BE%9B%E6%9D%A1%E4%BB%B6"
Top2 "hotScore":"2325661"
Top2 "hotChange":"same"
Top2 "hotTag":"0"
Top2 "appUrl":"https://www.baidu.com/s?wd=%E7%BB%8F%E7%BA%AA%E4%BA%BA%E40%E4%BE%9B%E6%9D%A1%E4%BB%B6&rsv"
"""
regex = re.findall(r'":"(.*?)"', text)
for data in regex:
print(data)
運行之后,可以得到想要的結果,如下圖所示。
2、split()
這個方法是來自【??(這是月亮的背面)】大佬的思路,后來我自己寫了小代碼如下。
# -*- coding: utf-8 -*-
import re
text = """
Top2 26
Top2 "word":"經紀人不得為假唱假演奏提供條件"
Top2 "query":"經紀人不得為假唱假演奏提供條件"
Top2 "show":[]
Top2 "desc":"18日,文旅部發(fā)布關于《演出經紀人員管理辦法(征求意見稿)》公開征求意見的公告。征求意見稿指出,演出經紀人員不得為演員假唱、假演奏提供條件。"
Top2 "img":"https://fyb-1.cdn.bcebos.com/fyb-1//5b4bc1de60744e69f34225af1452a395"
Top2 "url":"https://www.baidu.com/s?wd=%E7%BB%8F%E7%BA%AA%E4%BA%BA%E4%B8%8D%E5%BE%97%E4%B8%BA%E5%81%87%E5%94%B1%E5%81%87%E6%BC%94%E5%A5%8F%E6%8F%90%E4%BE%9B%E6%9D%A1%E4%BB%B6&rsv_dl=fyb_news"
Top2 "rawUrl":"https://www.baidu.com/s?wd=%E7%BB%8F%E7%BA%AA%E4%BA%BA%E4%B8%8D%E5%BE%97%E4%B8%BA%E5%81%87%E5%94%B1%E5%81%87%E6%BC%94%E5%A5%8F%E6%8F%90%E4%BE%9B%E6%9D%A1%E4%BB%B6"
Top2 "hotScore":"2325661"
Top2 "hotChange":"same"
Top2 "hotTag":"0"
Top2 "appUrl":"https://www.baidu.com/s?wd=%E7%BB%8F%E7%BA%AA%E4%BA%BA%E40%E4%BE%9B%E6%9D%A1%E4%BB%B6&rsv"
"""
raw_text = text.strip('\n').split('Top2 ')
for text in raw_text:
print(text.split('":"')[-1].replace('"', ''))
處理起來還是相對費勁的,而且不那么智能,針對文本定制的,比較“死板”,雖然勉強可以實現(xiàn),可是還是不太建議。
四、總結
本文從實際工作出發(fā),基于Python編程,針對網絡爬蟲過程中得到的字符串,使用正則表達式和字符串處理函數split(),完成了字符串的處理,滿足粉絲的要求。