Python的BeautifulSoup中的HTML結構解析

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

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