下表列出了主要的解析器,以及它們的優缺點:
解析器 | 使用方法 | 優勢 | 劣勢 |
---|---|---|---|
Python標準庫 | BeautifulSoup(markup, "html.parser") |
|
|
lxml HTML 解析器 | BeautifulSoup(markup, "lxml") |
|
|
lxml XML 解析器 |
|
|
|
html5lib | BeautifulSoup(markup, "html5lib") |
|
|
推薦使用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'