python-72:BS4中的clear(),extract(),decompose()

前面咱們已經將正文內容獲取出來了,其實到這裏已經能夠完成這個實例的要求了,可是我在結果中發現一些亂入的字符html


就是這些紅色框框圈出來的符號,原本這是不影響使用的,但對於輕微強迫症的我來講,這實在是有點不爽,因此我要想辦法將這些煩人的小符號去掉。python

首先,經過對源碼的分析,我發現這些符號表明的是一個連接程序員

<h1>快速開始<a class="headerlink" href="#id4" title="永久連接至標題">¶</a></h1>
<h1>安裝 Beautiful Soup<a class="headerlink" href="#id5" title="永久連接至標題">¶</a></h1>

首先,這是一個<h1>標籤,表明的是標題,我固然不能把這部分給刪除了,<h1>標籤裏面包含<a>標籤,並且它們的屬性都是同樣的,class="headerlink",因此我如今的作法應該是隻刪除<h1>標籤裏面帶有 class="headerlink" 的<a>標籤,BS4中有沒有能實現這個功能的函數呢?函數

clear()
clear() 方法移除當前tag的內容:

extract()
extract() 方法將當前tag移除文檔樹,並做爲方法結果返回:

decompose()
decompose() 方法將當前節點移除文檔樹並徹底銷燬:網站

這就是傳說中BS4的刪除三兄弟,理論上,這三個方法應該都是能夠實現咱們的功能的,既然要用到這幾個功能,咱們就來看看它們的用法和區別,爲了方便統一說明,我這裏直接在一段代碼中實現使用和對比code

#!/usr/bin/env python
# -*- coding:UTF-8 -*-
__author__ = '217小月月坑'
'''
BS4刪除三兄弟對比
'''

from bs4 import BeautifulSoup
# clear() 方法移除當前tag的內容:
markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
soup = BeautifulSoup(markup)
a_clear = soup.a
i_clear = soup.i.clear()
# extract() 方法將當前tag移除文檔樹,並做爲方法結果返回
markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
soup = BeautifulSoup(markup)
a_extract = soup.a
i_extract = soup.i.extract()
# decompose() 方法將當前節點移除文檔樹並徹底銷燬
markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
soup = BeautifulSoup(markup)
a_decompose = soup.a
i_decompose = soup.i.decompose()
# 輸出
print a_clear         # <a href="http://example.com/">I linked to <i></i></a>
print i_clear         # None
print a_extract       # <a href="http://example.com/">I linked to </a>
print i_extract       # <i>example.com</i>
print a_decompose     # <a href="http://example.com/">I linked to </a>
print i_decompose     # None

結果分析:htm

首先先說a_*,這個變量顯示的是使用三種方法後原來的字符串變成什麼樣子,首先,clear 的結果中還保留有<i></i>,而它的函數功能的描述是移除tag的內容,結果也是和它的描述相符合的,只是移除了tag的內容,它的標籤並無被移除,而extract 和 decompose 方法是移除當前tag的文檔樹,因此它們兩個的a_*輸出中並無<i></i>文檔

i_* 是執行函數的返回值,也就是說,執行這些方法以後,會不會將刪除的東西返回,更直白的理解是能不能看到刪除了什麼東西。其中只有extract方法的說明中提到有返回值,這裏輸出的結果中也能夠體現字符串

刪除三兄弟的用法和區別就簡單講到這裏,咱們如今關注的主要問題應該是,怎麼在咱們摳出來的正文的代碼塊中將含有class="headerlink" 屬性的標籤刪除源碼

啊,這裏真的是,接着講的話又太長,轉到下一小節的話又顯得我有點短小,因此我決定在這裏聊點別的

最近經同事介紹發現了一個頗有價值的網站:stackoverflow ,中文名叫堆棧溢出,不過我更喜歡它的另外一個名字,爆棧,這是國外的一個專門的程序員論壇,你能夠到上面提問也能夠回答問題,說實話,對於技術這方面的東西,我仍是比較承認老外的,因此,常常去上面逛的話,應該會有不少的收穫,可是有一些很差的方面就是這個網站加載得真的很慢,並且所有都是英文的,反正大不了也恰好練練本身的 poor english

好了,收拾收拾,準備進入下一小節去解決咱們的問題

相關文章
相關標籤/搜索