好了,前面也進行了幾回失敗的嘗試,我來總結一下啊
首先,咱們全部的嘗試本質上是基於一個方法,直接將獲取出來的全部數據一次性刪除。咱們選擇了一個看似最簡單的方法,咱們將數據獲取出來以後想直接將全部數據一次性刪除,一勞永逸,現實是咱們失敗了,但不要緊這是一個很好的作法,在面對事情的時候一開始先嚐試最簡單的方法,這是一個很好的選擇,只是咱們運氣很差罷了。其實我以爲上一小節仍是很重要的,這些問題都是我在學習過程當中遇到的,恰好有機會一塊兒整理出來,但願能給遇到相同問題的人一個解決的思路
既然前面的嘗試不成功,那麼咱們就來換一種思路,我不能一次性把你所有刪除,那我一條一條的刪除總能夠了吧
好了,方向已經找好了,如今來考慮細節
我以爲一開始處理不少條數據的話會很容易形成混亂,因此我決定只刪除一條數據看看是什麼結果,前面也已經說過了,find()函數是返回匹配到的第一個結果,就是它了,擬定的大體流程應該是:使用find()函數獲取第一個要刪除的標籤,而後使用clear()進行刪除,再將結果輸出看是否成功,根據流程我寫下了這樣的代碼:
python
import urllib2 from bs4 import BeautifulSoup url = 'http://beautifulsoup.readthedocs.org/zh_CN/latest/#' request = urllib2.Request(url) response = urllib2.urlopen(request) contents = response.read() soup = BeautifulSoup(contents) result = soup.find(itemprop="articleBody") result.find(attrs={"class": "headerlink"}).clear() print result.get_text()
結果顯示第一個符號已經被刪除了函數
這說明咱們的這個嘗試應該是奏效的,如今咱們來想一想怎麼將這個方法應用到咱們全部要刪除的tag中來學習
首先我第一個想的是在循環裏面實現,先設置一個while循環,判斷find(attrs={"class": "headerlink"})的返回值,當返回值不爲空時一直使用find函數將第一個刪除標籤找出來並將它刪除,當返回值爲空時執行另外的操做測試
前面爲了更好的獲取所有數據咱們使用了find_all函數,find_all 返回的是一個列表,既然是列表,那我應該能夠對它進行操做,我能夠直接遍歷這個列表並對列表裏面的每個元素作刪除處理,這也是一個很好的嘗試並且看起來比上衣個要好一點,因此我寫了下面的代碼來進行測試
url
#!/usr/bin/env python # -*- coding:UTF-8 -*- __author__ = '217小月月坑' ''' 去掉不和諧的符號 ''' import urllib2 from bs4 import BeautifulSoup url = 'http://beautifulsoup.readthedocs.org/zh_CN/latest/#' request = urllib2.Request(url) response = urllib2.urlopen(request) contents = response.read() soup = BeautifulSoup(contents) result = soup.find(itemprop="articleBody") for i in result.find_all(attrs={"class": "headerlink"}): i.clear() print result.get_text()
結果是這樣的code
咱們看到的結果中已經那個符號已經被刪除了,說明了在使用列表遍歷刪除的方法是能夠成功的get
好了,咱們已經可以按照原來的格式將文章正文下載下來,這個實例到這裏就基本完成了,咱們加上寫入文件的部分來看看最終的效果是怎樣的吧
it