簡介
接續著上一篇,我們已經套用了Request來抓取網頁資料,並透過Bs來解析html格式,且實作了Pretty、Title、Find、Find_all四種常用方法,而Bs不僅僅只有這些好用的函式可以用,本篇將分享以函示為標題,並且附上實作的解說。
Find& Select

我們在使用Find時候,在html code中看到的東西都可以被搜索到,但是大家必須分清楚,你是要找html還是css方面,這會影響到Find函式中所要帶的值,假如帶錯,就會找不到。上圖可以看到『Find_all』中所要找的是html中的h3與a這個值,[]是打包你要找的標籤名稱。


Select : 假如我們要找html的div中的子結點,這邊就可以使用上Select方法,在方法中填入要找的目標html的名稱即可,該方法是找尋多個子結點而也有搜尋單個子結點的方法,就是Select_one,如上圖二。
CSS搜尋:在先前我們都使用html來找網頁中的元素,這邊我們來介紹一下一些用css搜尋的方法。

但是要用Css搜尋前,還是需要html的主要搜尋標的,才能再用css class name去進階搜尋,如上圖是最基本的css搜尋法。在find的函示中,加入class屬性並且在『=』後加入css class name即可。

當然使用了css搜尋也是可以加入Limit限制,如上圖,由於都是使用Find or Find_all函式。

假如大家想單純使用css來找目標其實也是可以,但就不是用Find函式了。可以看到上圖,把Find換成Select並在函式中填入css name,但要注意的是,在Find中市不用加『.』html的css引用方式,而這邊的select則需要加該符號。

ID or PID:當然也可以透過ID或是PID來搜尋目標,我們回到使用Find來搜尋,並搭配ID,如上圖,一樣可以找到我們要的目標。

prev & next:該功能是找尋某個標的的前一個或後一個目標,如上圖,我們印出bs的body中的『a』的前一個目標與下一個目標,黑色框框處就是搜尋功能中定錨的作用,再透過『next_sibling & previous_sibling』,就找到前後的文字。
Modify Tree

這章節要講的是,透過bs我們可以找到我們想找的標籤、文字等等目標,其實bs也可以將網頁中的內容作改變,但不會改變線上本體的網頁。上圖是最基本的修改方式,直接把<a>中的文字做一個修正,修正方法是先取的要改的容器,再取出容器中要改的屬性,並直接附屬你要改得值即可。

Insert:而insert這個方法是從容器中的元素再加入新的元素,如上圖,我們先宣告一個單純的html,而<a>中有兩個元素,標示1跟2,而在標示3的是我們要新增的元素,接著就透過了『 insert() 』來將新元素丟進,印出的結果如箭頭處。

Clear:有新增當然就有清除,我們直接選擇了要清除的容器,接著使用『 clear() 』就可以把容器內的東西全部清空。

Wrap:這功能是在將容器包裝在另一個容器中的功能,以上圖為例第一個要包裝的是『 p.string.wrap() 』,先要包裝<b>,由於是包裝p裡面的文字,所以你可以看到印出來的結果是在p容器之內。而第二要包裝的是『 p.wrap() 』,要包裝<div>,因為是對p容器做包裝,所以印出來的結果<div>就是把<p>包在裡面。

Unwrap:承接上面的wrap,這功能有點像Clear但是可以指定什麼元素被移除,上圖就是將<a>中的<i>容器移除的方法,就是使用Unwrap。

但要注意的是,假如是容器中的String則無法使用Unwrap來移除,這時就要使用Clear了,如上圖錯誤。
小結
這篇可能比較枯燥,或python的記錄通常都是枯燥的,因為都是程式碼,但是當你開始使用且要找相關的用法時,這些紀錄將會是節省你時間的小字典或是常用功能庫,這些功能也是我有用到且比較常用的方法,當然還有超多的使用方法,大家可以直接去Bs的Document查找。