
上集回顧:
- BeautifulSoup
- 安裝和使用
上集快速領(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é):
- Tag對象
- name屬性
- attributes屬性
- 多值屬性
- 字符串
下集見