Python爬蟲庫學習筆記-BeautifulSoup

BeautifulSoup引入
(1)Beautiful Soup提供一些簡單的、python式的函數用來處理導航、搜索、修改分析樹等功能。它是一個工具箱,通過解析文檔爲用戶提供需要抓取的數據。
(2)Beautiful Soup自動將輸入文檔轉換爲Unicode編碼,輸出文檔轉換爲utf-8編碼。
(3)安裝:easy_install beautifulsoup4
(4)Beautiful Soup支持Python標準庫中的HTML解析器,還支持一些第三方的解析器。lxml解析器更加強大,速度更快,否則使用默認解析器。


創建Beautiful Soup對象
(1)先導入bs4庫。
(2)可以用字符串創建對象,也可以用本地的HTML文件來創建對象。
(3)使用prettify()方法格式化輸出對象的內容,返回的是補全好的html源碼文本。


四大對象種類
(1)Beautiful Soup將複雜HTML文檔轉換成一個複雜的樹形結構,每個節點都是Python對象。
(2)所有對象可以歸納爲4類:Tag,NavigableString,BeautifulSoup,Comment。

Tag對象
(1)Tag對象就是HTML中的標籤,通過點操作符獲取對應的標籤。但是查找的是所有內容中第一個符合要求的標籤。
(2)對於Tag對象有兩個重要屬性:name和attrs。屬性也是通過點操作符獲取,返回的是一個字典。
(3)也可以使用[]操作符單獨獲取某個Tag的屬性,返回的是列表。
(4)還可以使用Tag對象的get方法,傳入屬性的名稱。
(5)還可以對屬性的內容等等進行修改,就是通過以上方法獲取後使用賦值符號就可以了。
(6)還可以對屬性進行刪除操作,使用del關鍵字。

NavigableString對象
(1)要想獲取標籤內部的文字,使用.string屬性即可,返回的就是一個NavigableString類型的對象。

BeautifulSoup對象
(1)BeautifulSoup對象表示的是一個文檔的全部內容,大部分時候,可以把它當作Tag對象,是一個特殊的Tag,我們可以分別獲取它的類型,名稱,以及屬性。

Comment對象
(1)Comment對象是一個特殊類型的NavigableString對象,輸出的內容不包括註釋符號,但是其它字符當使用.string屬性訪問一個標籤的內容時還是會顯示出來的。
(2)所以在處理文本時,如果有些標籤的內容包含註釋的話,要根據類型來作相應的處理。


遍歷文檔樹
(1)直接子節點。要點是.contents和.children屬性。.contents屬性返回的是一個列表,而.children屬性返回的是一個list生成器對象,都可以遍歷訪問。
(2)所有子孫節點。.descendants屬性,像是DFS一樣遍歷指定Tag對象樹的所有子孫節點。
(3)節點內容。.string屬性。如果一個標籤裏面沒有標籤了,那麼.string就會返回標籤裏面的內容。如果標籤裏面只有唯一一個標籤了,那麼.string也會返回最裏面的內容。
(4)如果tag包含了多個子節點,tag就無法確定.string屬性獲取的是哪個子節點的內容,那麼,.string輸出的結果是None。
(5)多個內容。.string,.stripped_strings屬性。使用.strings獲取多個內容,返回的是一個列表,需要遍歷獲取每個內容。要注意的是,有些元素是空行。
(6)當輸出的字符串中包含了很多空格或空行時,使用.stripped_strings就可以獲取去除空行後的內容。
(7)父節點。.parent屬性。
(8)全部父節點。.parents屬性。這個屬性可以遞歸得到元素的所有父輩節點,可以使用for循環遍歷所有節點。
(9)兄弟節點。.next_sibling,.previous_sibling屬性。這裏要注意的是實際文檔中的tag的.next_sibling和.previous_sibling屬性通常是字符串或者空白,因爲空白或者空行也可以被視作一個節點,所以得到的結果可能是空白或者空行。
(10)全部兄弟節點。.next_sibling和.previous_siblings屬性。可以使用for循環對當前節點的兄弟節點迭代輸出。
(11)前後節點。.next_element和.previous_element屬性。這兩個屬性不是針對兄弟節點的,而是在所有節點,部分層次。
(12)所有前後節點。.next_elements和.previous_elements屬性。


搜索文檔樹
(1)使用find_all過濾時,遇到屬性名是python關鍵詞時,在屬性名後加個下劃線,如class_=XXX。
(2)有些tag屬性在搜索中不能使用,比如HTML5中的data-*屬性。這使可以通過find_all方法的attrs參數定義一個字典參數來搜索包含特殊屬性的tag。
(3)通過text參數可以搜索文檔中的字符串內容,text參數接受字符串,正則表達式,列表和True。
(4)使用limit參數限制返回結果的數量。
(5)在調用find_all方法時,Beautiful Soup會檢索當前tag的所有子孫節點,如果只想搜索tag的直接子節點,設置參數recursive=False。
(6)還有很多其他find相關的方法請參考文檔。


CSS選擇器
(1)使用soup.select()方法,按照類似css的方式篩選元素,返回類型是list。


具體內容請參考:靜覓 » Python爬蟲利器二之Beautiful Soup的用法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章