以下是要爬蟲的html內容:
<div class="article block untagged mb15" id='qiushi_tag_113452216'> <div class="author"> <a href="/users/30450374" target="_blank"> <img src="http://pic.qiushibaike.com/system/avtnew/3045/30450374/medium/20151014094231.jpg" /> 本宮不服 </a> </div>
<div class="content"> 這是鎮上一條偏僻路上的一家小飯館,老板是一對老夫妻,開店幾十年了,每次中午路過都要在這吃,滿滿的實惠。雖然飯店看着挺破敗,但菜什么都很干凈,因為挺偏的路上,人流較少,菜備的不多,有的菜都現洗。最重要的是價格,特實惠,在鎮上其它飯店吃飯,雞,魚,價格18元,素菜8元。還不多,土豆燉肉28,只見土豆不見肉。而這家,紅燒肉15一盤。全是肉,炒雞塊10元,紅燒扁魚12,素肉5元。這一大碗有肉圓,蘑菇,肉皮等的湯才7元 <!--1445510496--> </div> <div class="thumb"> <a href="/article/113452216" target="_blank"> <img src="http://pic.qiushibaike.com/system/pictures/11345/113452216/medium/app113452216.jpg" alt="這是鎮上一條偏僻路上的一家小飯館" /> </a> </div> <div class="stats"> <span class="stats-vote"><i class="number">491</i> 好笑</span> <span class="stats-comments"> <span class="dash"> · </span> <a href="/article/113452216" data-share="/article/113452216" id="c-113452216" class="qiushi_comments" target="_blank"> <i class="number">97</i> 評論 </a> </span> </div> <div id="qiushi_counts_113452216" class="stats-buttons bar clearfix"> <ul class="clearfix"> <li id="vote-up-113452216" class="up"> <a href="javascript:voting(113452216,1)" class="voting" data-article="113452216" id="up-113452216" rel="nofollow"> <i class="iconfont" data-icon-actived="󰁡" data-icon-original="󰀟">󰀟</i> <span class="number hidden">498</span> </a> </li> <li id="vote-dn-113452216" class="down"> <a href="javascript:voting(113452216,-1)" class="voting" data-article="113452216" id="dn-113452216" rel="nofollow"> <i class="iconfont" data-icon-actived="󰀠" data-icon-original="󰀠">󰀠</i> <span class="number hidden">-7</span> </a> </li> <li class="comments"> <a href="/article/113452216" id="c-113452216" class="qiushi_comments" target="_blank" rel="nofollow"> <i class="iconfont" data-icon-actived="󰁢" data-icon-original="󰀝">󰀝</i> </a> </li> </ul> </div> <div class="single-share"> <!-- JiaThis Button BEGIN --> <div class="jiathis_style"> <span class="jiathis_txt">分享到:</span> <a href="###" class="jiathis_button_weixin" rel="external nofollow"></a> <a href="###" class="jiathis_button_cqq" rel="external nofollow"></a> <a href="###"class="jiathis_button_qzone" rel="external nofollow"></a> <a href="###" class="jiathis_button_tsina" rel="external nofollow"></a> <a href="###" class="jiathis_button_tieba" rel="external nofollow"></a> <a href="http://www.jiathis.com/share" class="jiathis jiathis_txt jtico jtico_jiathis" target="_blank" rel="external nofollow"></a> </div> <!-- JiaThis Button END --> </div> <div class="single-clear">
</div> </div>
我們可以看到,每一個段子都是<div class=”article block untagged mb15″ id=”…”>…</div>包裹的內容。
現在我們想獲取發布人,發布日期,段子內容,以及點贊的個數。不過另外注意的是,段子有些是帶圖片的,如果我們想在控制台顯示圖片是不現實的,所以我們直接把帶有圖片的段子給它剔除掉,只保存僅含文本的段子。
所以寫出的正則表達式如下:
content = response.read().decode('utf-8')
pattern = re.compile('<div.*?author">.*?<a.*?<img.*?>(.*?)</a>.*?<div.*?'+
'content">(.*?)<!--(.*?)-->.*?</div>(.*?)<div class="stats.*?class="number">(.*?)</i>',re.S)
items = re.findall(pattern,content)
for item in items:
#item[0]是一個段子的發布者,item[1]是內容,item[2]是發布時間,item[3]是圖片,item[4]是點贊數
print item[0],item[1],item[2],item[3],item[4]
現在正則表達式在這里稍作說明
1).*? 是一個固定的搭配,.和*代表可以匹配任意無限多個字符,加上?表示使用非貪婪模式進行匹配,也就是我們會盡可能短地做匹配,以后我們還會大量用到 .*? 的搭配。
2)(.*?)代表一個分組,在這個正則表達式中我們匹配了五個分組,在后面的遍歷item中,item[0]就代表第一個(.*?)所指代的內容,item[1]就代表第二個(.*?)所指代的內容,以此類推。
3)re.S 標志代表在匹配時為點任意匹配模式,點 . 也可以代表換行符。
這樣我們就獲取了發布人,發布時間,發布內容,附加圖片以及點贊數。
在這里注意一下,我們要獲取的內容如果是帶有圖片,直接輸出出來比較繁瑣,所以這里我們只獲取不帶圖片的段子就好了。所以,在這里我們就需要對帶圖片的段子進行過濾。我們可以發現,帶有圖片的段子會帶有類似下面的代碼,而不帶圖片的則沒有,所以,我們的正則表達式的item[3]就是獲取了下面的內容,如果不帶圖片,item[3]獲取的內容便是空。
<a href="/article/112061287?list=hot&s=4794990" target="_blank">
<img src="http://pic.qiushibaike.com/system/pictures/11206/112061287/medium/app112061287.jpg" alt="但他們依然樂觀">
</a>
所以我們只需要判斷item[3]中是否含有img標簽就可以了。我們再把上述代碼中的for循環改為下面的樣子:
for item in items:
haveImg = re.search("img",item[3])
if not haveImg:
print item[0],item[1],item[2],item[4]