上一小節咱們認識了刪除三兄弟,可是咱們最重要的仍是要解決問題,首先,毫無疑問,咱們確定要從這三種方法中選一個來使用,雖然前面已經講解了這三個函數的使用方法而且對實例進行了分析,可是,這仍是遠遠不夠的python
前面使用的例子中,咱們只是對單個句子進行刪除操做,文檔樹只是一個句子,咱們刪除的也只是這個句子中的一兩個單詞而已,而咱們這個實例要求咱們可以在一大塊的網頁源碼中刪除特定的句子,這些句子還不知道有多少行,這兩種狀況之間相差很大,咱們須要想辦法從例子中拓展思惟而後解決咱們的問題函數
咱們把要實現的功能細化分析一下,首先,找出須要刪除的句子,而後想辦法將這些句子刪除並輸出測試
1. 找出須要刪除的句子
url
前面已經說過了,咱們須要刪除的帶有 class="headerlink" 屬性的代碼,就像下面的代碼同樣,
code
<h2>註釋及特殊字符串<a class="headerlink" href="#id14" title="永久連接至標題">¶</a></h2>
咱們不知道這樣的代碼一共有多少行,要想將這些代碼所有找出來,咱們只能用find_all,前面說了find只能找到匹配的第一個代碼,咱們能夠測試看看find_all返回的結果,咱們要獲取的是帶有某個屬性的標籤,這跟前面獲取正文的代碼好像同樣,我仍是打算使用keyword參數,因而我寫下了這樣一段代碼,對象
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") print result.find_all(class = "headerlink")
很不幸的是運行的時候報錯了文檔
File "test.py", line 20
print result.find_all(class = "headerlink")
^
SyntaxError: invalid syntax
錯誤緣由顯示無效的參數,我以爲很納悶,爲何傳給find_all的參數是無效的字符串
這裏咱們傳的是class,而class是HTML的一個關鍵字,也是python的關鍵字,程序並不能識別它究竟是什麼,因此報了一個無效的參數這個錯誤,幸運的是,find_all中已經針對這種狀況作了應對的機制,前面也已經說過了,咱們須要使用另外一個參數 attrs 傳入一個字典,因而,上面的代碼應該將最後一句修改爲這樣get
print result.find_all(attrs={"class": "headerlink"})
好了,修改後的代碼運行的結果跟咱們預想的同樣,是一個列表,如今咱們來考慮下一個問題,怎麼將獲取到的代碼刪除源碼
2. 怎麼將獲取的代碼刪除
前面的例子只是刪除文檔樹裏面的一句話,咱們還沒遇到刪除多句話的狀況,不過我天然而然的想到直接用前面的方法來試試看行不行,因而我寫下了這樣的代碼
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") lines = result.find_all(attrs={"class": "headerlink"}) lines.clear() print result.get_text()
可是結果倒是這樣的
AttributeError: 'ResultSet' object has no attribute 'clear'
屬性錯誤,意思是說這個對象沒有這個屬性唄,這是爲何?
首先,find_all 返回的是一個列表,extract() 是BS4裏面的一個方法,要使用BS4的方法,前面也說了,須要將文檔轉換爲BeautifulSoup 對象,可是lines是一個列表,咱們上面的代碼直接對這個列表調用extract(),這是不對的,咱們還須要將lines轉換爲BeautifulSoup 對象,好吧,再把代碼修改一下
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") lines = BeautifulSoup(result.find_all(attrs={"class": "headerlink"})) lines.clear() print result.get_text()
結果仍是不對
TypeError: expected string or buffer
類型錯誤!!傳入的必須是字符串或者緩衝區數據!!天了嚕,還讓不讓人好好寫代碼啦
這個錯誤的緣由也很簡單,生成BeautifulSoup的數據必須是字符串或緩衝區裏面的內容,而list是不能拿來生成BeautifulSoup對象的,因此咱們還須要將list轉換成string,因而程序被改爲了這樣子
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") lines = BeautifulSoup(str(result.find_all(attrs={"class": "headerlink"}))) lines.clear() print result.get_text()
此次運行終於沒有報錯了,然而仍是沒有什麼卵用,由於咱們想要刪除的那個字符還依然健在
holy shit
真真是一口熱翔