來看看咱們這個實例使用到的網址,你們能夠先打開看看:http://blog.jobbole.com/all-posts/
python
咱們要作的第一步就是從這個網頁中獲取最新文章的標題和網址。能夠看到,網頁上每一頁顯示20篇文章,並且通過我幾天的觀察,天天更新的文章也就三四篇,這就意味着,若是咱們每次獲取20篇文章的話,確定會有大部分是重複的,然而事實上咱們只須要獲取天天最新發布的文章,好在,每篇文章上都寫有發佈日期,並且在源碼中也很容易找獲得,就像這樣,全部發布的文章都是按照這個形式在源碼中進行編寫的,這段代碼咱們後面的分析中也會常常用到app
<!-- BEGIN .post-meta --> <div class="post-meta"> <p> <a class="archive-title" target="_blank" href="http://blog.jobbole.com/97162/" title="這樣的谷歌街景,你確定沒見過">這樣的谷歌街景,你確定沒見過</a><br /> 2016/01/14 · <a href="http://blog.jobbole.com/category/geeks/" title="查看 極客 中的所有文章" rel="category tag">極客</a> · <a href="http://blog.jobbole.com/97162/#comments" title="《這樣的谷歌街景,你確定沒見過》上的評論">2 條評論</a> </p> <span class="excerpt"><p>在德國港口城市漢堡有個歷史悠久的城區叫庫房區,其中有一個著名的旅遊景點:微縮仙境。它是世界上最大的鐵路微縮模型系統,因此也被稱之爲「微縮火車樂園」。你可能在現場參觀,但你絕對從這個特別的視角來欣賞。</p> </span> <p class="align-right"><span class="read-more"><a target="_blank" href="http://blog.jobbole.com/97162/">閱讀全文 »</a></span></p> </div> <!-- END .post-meta -->
那麼,應該怎麼從上面那段代碼中獲取咱們想要的文章網址,標題,和發佈時間呢post
到如今爲止,咱們一共學習了兩種獲取網頁信息的方法,BS4和RE,可是,究竟使用哪種方法比較好學習
首先來講說RE,根據對網頁源碼的分析,很容易將RE寫出來url
re.compile(r'class="archive-title".*?href="(.*?)".*?title="(.*?)">.*?<br />(.*?)<a.*?',re.S)
結果是這樣的:spa
好吧,雖然格式上有一些不盡如人意可是總算將咱們須要的東西獲取出來了,如今來看看BS4實現的代碼是怎樣的code
經過對網頁源碼的分析咱們知道文章的網址和標題是在tag的屬性裏面的,日期是tag外面的文本blog
<a class="archive-title" target="_blank" href="http://blog.jobbole.com/97162/" title="這樣的谷歌街景,你確定沒見過">這樣的谷歌街景,你確定沒見過</a><br /> 2016/01/14 ·
也就是說,咱們的BS4須要同時獲取標籤內的屬性和標籤外的文本,這好像在前面的學習中沒有遇到過,我通過了不少次嘗試也沒能只使用BS4同時將這三個信息獲取出來,因此選了一個擇中的方法,先分別獲取全部的信息再一次性輸出出來get
date_list = [] url_list = [] title_list = [] # get the date and add to a list for item in soup.find_all(attrs = {"class":"post-meta"}): date = re.findall(r'\d{4}/\d{2}/\d{2}',item.get_text()) if date: date_list.append(date) # get href ,title and add to list for mess in soup.find_all(attrs = {"class":"archive-title"}): url = mess.get('href') url_list.append(url) title = mess.get('title') title_list.append(title) # printout the message for i in range(len(date_list)): print date_list[i], url_list[i], title_list[i]
結果以下:源碼
這裏暫時先使用RE,因而可知BS4也不是全能的,咱們再來看看怎麼將時間處理到咱們想要的格式,從前面的結果看咱們獲取的時間是這樣一種格式的:
2016/01/14 ·
可是這並非我想要的結果,它帶有的空格和亂七八糟的字符真的是影響個人視線,我想要的是"2016/01/14"這樣的日期,因此爲了實現個人想法,還須要對時間這部分進行處理