BS把HTML看做一個樹形,以標籤和文本爲基本類型,一個標籤包含其他標籤,被解析爲一個標籤是另一個標籤的子樹。那麼,最終整個HTML文檔被解析爲一棵樹的形式。
BS包括四種基本類型: Soup(樹),Tag(標籤節點),String(字符節點),Comment(註釋節點)。
這四種類型的節點構成樹,Soup代表這顆樹,String爲葉子節點,tag爲標籤子節點,爲其標籤包含的所有內容。
剖析 HTML
使用 BeautifulSoup 類剖析HTML文檔。 BeautifulSoup會得出以下一些信息:
- 有些標籤可以內嵌 (<BLOCKQUOTE>) ,有些不行 (<P>).
- table和list標籤有一個自然的內嵌順序。例如,<TD> 標籤內爲 <TR> 標籤,而不會相反。
- <SCRIPT> 標籤的內容不會被剖析爲HTML。
- <META> 標籤可以知道文檔的編碼類型。
剖析樹
到目前爲止,我們只是載入文檔,然後再輸出它。 現在看看更讓我們感興趣的剖析樹: Beautiful Soup剖析一個文檔後生成的數據結構。
剖析對象 (BeautifulSoup或 BeautifulStoneSoup的實例)是深層嵌套(deeply-nested), 精心構思的(well-connected)的數據結構,可以與XML和HTML結構相互協調。 剖析對象包括2個其他類型的對象,Tag對象, 用於操縱像<TITLE> ,<B>這樣的標籤;NavigableString對象, 用於操縱字符串,如"Page title"和"This is paragraph"。
建樹
import bs4#導入BeautifulSoup庫
Soup = BeautifulSoup(html)#其中html 可以是字符串,也可以是句柄
需要注意的是,BeautifulSoup會自動檢測傳入文件的編碼格式,然後轉化爲Unicode格式
節點屬性
可以通過Tag.attrs訪問,返回字典結構的屬性。
或者Tag.name這樣訪問特定屬性值,如果是多值屬性則以列表形式返回。
遍歷
子節點:
Tag.Tag_child1:直接通過下標名稱訪問子節點。
Tag.contents:以列表形式返回所有子節點。
Tag.children:生成器,可用於循環訪問:for child in Tag.children
String 子節點:
Tag.String:Tag只有一個String子節點是,可以這麼訪問,否則返回None
Tag.Strings:生成器,可用於循環訪問:for str in Tag.Strings
子孫節點:
Tag.descendants:生成器,可用於循環訪問:for des inTag.descendants
父節點:
Tag.parent:父節點
Tag.parents:父到根的所有節點
兄弟節點:
Tag.next_sibling
Tag.next_siblings
Tag.previous_sibling
Tag.previous_siblings
查找
最常用的是find_all()函數
方法搜索當前tag的所有tag子節點,並判斷是否符合過濾器的條件。
find_all( name , attrs , recursive , text ,**kwargs )
第一個參數爲Tag的名稱
#第一個參數爲Tag的名稱,如:
tag.find_all(‘title’)
#得到”<title>&%^&*</title>”,結果爲一個列表
第二個參數爲匹配的屬性
tag.find_all(“title”,class=”sister”)
#得到如”<title class = “sister”>%^*&</title>
第二個參數也可以爲字符串,得到字符串匹配的結果
tag.find_all(“title”,”sister”)
#得到如”<title class = “sister”>%^*&</title>
參考文檔
https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html