自学Python六 爬虫基础必不可少的正则
要想做爬蟲(chóng),不可避免的要用到正則表達(dá)式,如果是簡(jiǎn)單的字符串處理,類似于split,substring等等就足夠了,可是涉及到比較復(fù)雜的匹配,當(dāng)然是正則的天下,不過(guò)正則好像好煩人的樣子,那么如何做呢,熟記正則元字符和語(yǔ)法,找個(gè)在線匹配測(cè)試網(wǎng)站隨時(shí)測(cè)試(其實(shí)在正則上我也是個(gè)菜逼。。。一直在慢(詢)慢(問(wèn))測(cè)(大)試(牛)中得到正解),不過(guò)要相信,用熟了自然就巧了!
首先,推薦兩篇博客,分別介紹了python自帶的正則標(biāo)準(zhǔn)庫(kù)re以及regex模塊:Python正則表達(dá)式指南(re)? ? ?Python的regex模塊——更強(qiáng)大的正則表達(dá)式引擎。而我呢,最不擅長(zhǎng)總結(jié)各種庫(kù)各種語(yǔ)法之類的了,本篇博客就稍微簡(jiǎn)單介紹常用的以及爬蟲(chóng)程序開(kāi)發(fā)過(guò)程中的小例子!先說(shuō)說(shuō)比較常用的6個(gè)re中的函數(shù):
re.compile(pattern,flag)#根據(jù)正則匹配字符串以及附加條件,返回一個(gè)pattern對(duì)象
re.search(pattern,string)#搜索整個(gè)字符串,知道發(fā)現(xiàn)符合正則表達(dá)式的字符串
re.match(pattern,string)#從頭開(kāi)始檢測(cè)字符串是否符合正則表達(dá)式,必須從字符串的第一個(gè)字符開(kāi)始
re.sub(pattern,replacement,string)#將字符串中根據(jù)正則匹配到的字符串用replacement替換
re.split(pattern,string)#根據(jù)正則表達(dá)式分割字符串,將分割后的字符串放到list中返回
re.findall(pattern,string)#根據(jù)正則表達(dá)式分割字符串,將找到的所有結(jié)果放到list中返回
python中的匹配默認(rèn)是貪婪的,所謂貪婪就是嘗試盡可能的匹配更多的字符,比如:正則表達(dá)式"ab*"如果用于查找字符串"abbbc",將找到"abbb",如果是非貪婪的呢,得到的結(jié)果就是"a"。同樣有時(shí)候我們時(shí)刻要注意轉(zhuǎn)義字符等等,在net中我們有@,在python中我們有r,用法一樣哦。讓我們先來(lái)看一段代碼:
1 >>> import re 2 >>> 3 >>> pattern = re.compile(r'hello',re.I) 4 >>> match = pattern.match('Hello World@!') 5 >>> if match: 6 ... print match.group() 7 ... 8 Hello 9 >>>在上面的代碼中,我們先生成了一個(gè)pattern對(duì)象,然后進(jìn)行了匹配,其中re.compile函數(shù)中,我們的re.I就是附帶條件:忽略大小寫(xiě)。其他模式可以自行搜索之,各種模式之間可以互相配合。其實(shí)我們可以放棄用re.compile函數(shù)而直接這么寫(xiě):
1 >>> match = re.match('hello','hello world!') 2 >>> print match.group() 3 hello這樣做少了一行re.compile(pattern,flags)代碼,但是也少了pattern的對(duì)象,各位如何使用之就仁者見(jiàn)仁智者見(jiàn)智吧。
python中還可以對(duì)正則匹配的返回結(jié)果進(jìn)行進(jìn)一步的控制,如:
1 >>> import re 2 >>> m = re.search("output_(\d{4})","output_2016.txt") 3 >>> print m.group() 4 output_2016 5 >>> print m.group(1) 6 2016 7 >>> print m.groups() 8 ('2016',)可以看到,我們的正則表達(dá)式output_(\d{4}) 其中包含一個(gè)正則表達(dá)式(\d{4}),像這樣被括號(hào)圈起來(lái)的正則表達(dá)式的一部分,我們稱之為群(group),我們可以用m.group(index)來(lái)查詢,group(0)是整個(gè)正則表達(dá)式的搜索結(jié)果,group(1)是第一個(gè)群,以此類推。。。。也許這樣看著并不方便,我們可以對(duì)群起名字:
>>> import re >>> m = re.search("(?P<year>\d{4})\.(?P<mon>\d{2})\.(?P<day>\d{2})","output_2016.01.18.txt") >>> m.groups() ('2016', '01', '18') >>> m.groupdict() {'year': '2016', 'mon': '01', 'day': '18'} >>> m.group("year") '2016' >>> m.group("mon") '01' >>> m.group("day") '18'讓我們看個(gè)實(shí)例:有一個(gè)文件,文件名為output_2016.01.18.txt。請(qǐng)讀取文件名中的日期時(shí)間信息,計(jì)算出當(dāng)日是星期幾,并將文件名修改為output_yyyy-mm-dd-w.txt,其中w為星期幾。
1 import os,re,datetime 2 filename="output_1981.10.21.txt" 3 get_time=re.search("(?P<year>\d{4})\.(?P<month>\d{2})\.(?P<day>\d{2})\.",filename) 4 year=get_time.group("year") 5 month=get_time.group("month") 6 day=get_time.group("day") 7 date=datetime.date(int(year),int(month),int(day)) 8 wd=date.weekday()+1 9 os.rename(filename,"output_"+year+"-"+month+"-"+day+"-"+str(wd)+".txt")好了,正則基礎(chǔ)就介紹到這里了,接下來(lái)讓我們?cè)囍M(jìn)行一下爬蟲(chóng)中的正則表達(dá)式。講個(gè)小例子:什么值得買的白菜價(jià)包郵信息。
什么值得買——白菜價(jià)
要爬取網(wǎng)頁(yè)信息,除了我們要得到網(wǎng)頁(yè)信息外最重要的就是把我們需要的信息提取出來(lái),我們f12來(lái)看一下要提取的html代碼:
我們看到我們想要得到的信息都在<h2 class="itemName">...</h2>之中。我們的正則表達(dá)式如下:
1 content = response.read().decode('utf-8') 2 pattern = re.compile('<h2 .*?itemName"><a.*?<span .*?black">(.*?)</span><span .*?red">(.*?)</span></a></h2>',re.S) 3 items = re.findall(pattern,content) 4 for item in items: 5 print item[0],item[1].*?是一個(gè)固定搭配,.和*可以匹配任意多個(gè)字符,加上?就是最小匹配,也就是我們上面說(shuō)的非貪婪模式。直白的說(shuō)就是匹配盡可能短的字符串。
(.*?)這個(gè)上面我們講了,他是正則匹配時(shí)的一個(gè)群。re.S標(biāo)志在正則匹配的時(shí)候?yàn)辄c(diǎn)任意匹配模式,即點(diǎn)可以代表任意字符比如換行符。這樣我們就獲得了每個(gè)商品的名稱和價(jià)格。(整個(gè)爬蟲(chóng)源碼在下一篇博客)
轉(zhuǎn)載于:https://www.cnblogs.com/jixin/p/5139484.html
與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的自学Python六 爬虫基础必不可少的正则的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: i2c驱动笔记
- 下一篇: python下载地址