Beautiful Soup 4 對(duì)象類型

2021-05-21 10:24 更新

Beautiful Soup將復(fù)雜HTML文檔轉(zhuǎn)換成一個(gè)復(fù)雜的樹形結(jié)構(gòu),每個(gè)節(jié)點(diǎn)都是Python對(duì)象,所有對(duì)象可以歸納為4種: ?Tag? , ?NavigableString? , ?BeautifulSoup? , ?Comment? .

Tag

?Tag? 對(duì)象與XML或HTML原生文檔中的tag相同:

soup = BeautifulSoup('<b class="boldest">Extremely bold</b>')
tag = soup.b
type(tag)
# <class 'bs4.element.Tag'>

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

Name

每個(gè)tag都有自己的名字,通過 ?.name? 來獲取:

tag.name
# u'b'

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

tag.name = "blockquote"
tag
# <blockquote class="boldest">Extremely bold</blockquote>

Attributes

一個(gè)tag可能有很多個(gè)屬性. tag ?<b class="boldest">? 有一個(gè) “class” 的屬性,值為 “boldest” . tag的屬性的操作方法與字典相同:

tag['class']
# u'boldest'

也可以直接”點(diǎn)”取屬性, 比如: ?.attrs? :

tag.attrs
# {u'class': u'boldest'}

tag的屬性可以被添加,刪除或修改. 再說一次, tag的屬性操作方法與字典一樣

tag['class'] = 'verybold'
tag['id'] = 1
tag
# <blockquote class="verybold" id="1">Extremely bold</blockquote>

del tag['class']
del tag['id']
tag
# <blockquote>Extremely bold</blockquote>

tag['class']
# KeyError: 'class'
print(tag.get('class'))
# None

多值屬性

HTML 4定義了一系列可以包含多個(gè)值的屬性.在HTML5中移除了一些,卻增加更多.最常見的多值的屬性是 class (一個(gè)tag可以有多個(gè)CSS的class). 還有一些屬性 ?rel? , ?rev? , ?accept-charset? , ?headers? , ?accesskey? . 在Beautiful Soup中多值屬性的返回類型是list:

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

css_soup = BeautifulSoup('<p class="body"></p>')
css_soup.p['class']
# ["body"]

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

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

將tag轉(zhuǎn)換成字符串時(shí),多值屬性會(huì)合并為一個(gè)值

rel_soup = BeautifulSoup('<p>Back to the <a rel="index">homepage</a></p>')
rel_soup.a['rel']
# ['index']
rel_soup.a['rel'] = ['index', 'contents']
print(rel_soup.p)
# <p>Back to the <a rel="index contents">homepage</a></p>

如果轉(zhuǎn)換的文檔是XML格式,那么tag中不包含多值屬性

xml_soup = BeautifulSoup('<p class="body strikeout"></p>', 'xml')
xml_soup.p['class']
# u'body strikeout'


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)