26、BeautifulSoup之Tag

Life is short, you need Python!

上集回顧:

  1. BeautifulSoup
  2. 安裝和使用

上集快速領(lǐng)略了一下 BeautifulSoup 的大概功能,并學(xué)習(xí)了如何安裝和構(gòu)造一個(gè) BeautifulSoup 對象。
本集學(xué)習(xí) BeautifulSoup 的 Tag 及其屬性。

由于HTML和XML是由大量tag組合和嵌套而成,所以檢索目標(biāo)信息就是檢索目標(biāo)tag的過程。

一、Tag對象
Tag 對象與XML或HTML原生文檔中的tag相同:

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

Tag有很多方法和屬性,其中最重要的屬性是: name和attributes。

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

tag.name
# u'b'

如果改變了tag的name,那將影響所有通過當(dāng)前Beautiful Soup對象生成的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 定義了一系列可以包含多個(gè)值的屬性。最常見的多值的屬性是 class (一個(gè)tag可以有多個(gè)CSS的class). 還有一些屬性 rel , rev , accept-charset , headers , accesskey。在Beautiful Soup中多值屬性的返回類型是list:

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.p['id']
# 'my id'

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

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.p['class']
# u'body strikeout'</pre>

五、字符串
字符串常被包含在tag內(nèi)。BeautifulSoup用 NavigableString 類來包裝tag中的字符串:

tag.string
# u'Extremely bold'
type(tag.string)
# <class 'bs4.element.NavigableString'>

一個(gè) NavigableString 字符串與Python中的Unicode字符串相同,通過 unicode() 方法可以直接將 NavigableString 對象轉(zhuǎn)換成Unicode字符串:

unicode_string = unicode(tag.string)
unicode_string
# u'Extremely bold'
type(unicode_string)
# <type 'unicode'>

本集總結(jié):

  1. Tag對象
  2. name屬性
  3. attributes屬性
  4. 多值屬性
  5. 字符串

下集見

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容