bs4:4種對象類型

下表列出了主要的解析器,以及它們的優缺點:

解析器 使用方法 優勢 劣勢
Python標準庫 BeautifulSoup(markup, "html.parser")
  • Python的內置標準庫
  • 執行速度適中
  • 文檔容錯能力強
  • Python 2.7.3 or 3.2.2)前 的版本中文檔容錯能力差
lxml HTML 解析器 BeautifulSoup(markup, "lxml")
  • 速度快
  • 文檔容錯能力強
  • 需要安裝C語言庫
lxml XML 解析器

BeautifulSoup(markup, ["lxml-xml"])

BeautifulSoup(markup, "xml")

  • 速度快
  • 唯一支持XML的解析器
  • 需要安裝C語言庫
html5lib BeautifulSoup(markup, "html5lib")
  • 最好的容錯性
  • 以瀏覽器的方式解析文檔
  • 生成HTML5格式的文檔
  • 速度慢
  • 不依賴外部擴展

  推薦使用lxml作爲解析器,C++寫的底層,效率更高。

對象的種類(4種)

Beautiful Soup將複雜HTML文檔轉換成一個複雜的樹形結構,每個節點都是Python對象,所有對象可以歸納爲4種:

Tag , NavigableString , BeautifulSoup , Comment .

Tag對象

soup = bs('<b class="boldest">Extremely bold</b>')
tag = soup.b
type(tag)

## <class 'bs4.element.Tag'>

Tag有很多方法和屬性,在 遍歷文檔樹  搜索文檔樹 中有詳細解釋.現在介紹一下tag中最重要的屬性: name和attributes 。

Name

每個tag都有自己的名字,通過.name獲取:

ag.name

# u'b'

如果改變了tag的name,那將影響所有通過當前Beautiful Soup對象生成的HTML文檔:

tag.name = "blockquote"
tag

# <blockquote class="boldest">Extremely bold</blockquote>

Attributes

一個tag可能有很多個屬性. tag <b class="boldest"> 有一個 “class” 的屬性,值爲 “boldest”。tag的屬性的操作方法與字典相同, 直接”點”取屬性,比如: .attrs :

tag.attrs

# {'class': 'boldest'}

tag的屬性可以被添加,刪除或修改。

多值屬性

最常見的多值的屬性是 class (一個tag可以有多個CSS的class). 還有一些屬性 rel , rev , accept-charset , headers , accesskey . 在Beautiful Soup中多值屬性的返回類型是列表(list):

css_soup = bs('<p class="body strikeout"></p>')
css_soup.p['class']

# ["body", "strikeout"]

如果某個屬性看起來好像有多個值,但在任何版本的HTML定義中都沒有被定義爲多值屬性,那麼Beautiful Soup會將這個屬性作爲字符串(str)返回: 

id_soup = BeautifulSoup('<p id="my id"></p>')
id_soup.p['id']

# 'my id'

 

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