找到了bs4的中文文檔,對昨天爬蟲程序裏所涉及的bs4庫進行學習。這篇代碼涉及到tag、Name、Attributes以及多值屬性。css
1 ''' 2 對象的種類 3 Beautiful Soup將複雜HTML文檔轉換成一個複雜的樹形結構,每一個節點都是Python對象。 4 全部對象能夠概括爲4種: Tag , NavigableString , BeautifulSoup , Comment 。 5 ''' 6 7 from bs4 import BeautifulSoup 8 9 soup = BeautifulSoup('<b class="boldest">Extremely bold</b>','lxml') 10 tag = soup.b 11 type(tag) 12 #<class 'bs4.element.Tag'> 13 14 15 #TAG.NAME 16 tag 17 #<b class="boldest">Extremely bold</b> 18 tag.name 19 #'b' 20 tag.name = 'blockquote' 21 tag 22 #<blockquote class="boldest">Extremely bold</blockquote> 23 ''' 24 即tag首的'<'後和tag尾'</>'內,就是這個tag的名稱. 25 若是改變了tag的name,那將影響全部經過當前Beautiful Soup對象生成的HTML文檔 26 ''' 27 tag.name = 'b' 28 29 30 #Attributes 31 '''一個tag能夠有多個屬性。如tag <b class="boldest">,他有一個"class"屬性,值爲"boldest"。''' 32 #tag屬性的操做方法與字典相同。 33 tag['class'] 34 # u'boldest' 35 tag.attrs #「點」取屬性 36 # {u'class':u'boldest'} 37 ''' 38 tag的屬性能夠被添加、刪除或修改。tag的屬性操做方法與字典同樣。 39 ''' 40 tag['class'] = 'verybold' #屬性查看 41 tag['id'] = 1 #屬性查看 42 tag 43 # <blockquote class="verybold" id="1">Extremely bold</blockquote> 44 45 del tag['class'] #屬性刪除 46 del tag['id'] #屬性刪除 47 tag 48 # <blockquote>Extremely bold</blockquote> 49 50 tag['class'] #刪除屬性後查看,報錯 51 # KeyError: 'class' 52 print(tag.get('class')) 53 # None 54 55 56 #多值屬性 57 ''' 58 最多見的多值屬性是class,還有一些多值屬性如 rel, rev, accept-charset, headers,accesskey等。 59 多值屬性在 BeautifulSoup 中的返回類型是list: 60 ''' 61 css_soup = BeautifulSoup('<p class="body strikeout"></p>') #這裏雖然body和strikeout只用了一個空格隔開,但其仍然會被隔開返回。(大概由於在HTML的語法裏這就表明了兩個屬性) 62 css_soup.p['class'] 63 # ["body", "skrikeout"] 64 65 css_soup = BeautifulSoup('<p class="body"></p>') 66 css_soup.p['class'] 67 # ["body"] #這裏雖然class的屬性只有一個值,可是由於class自己是一個多值屬性,故返回了list 68 ''' 69 (接上一行註釋)而若是某個屬性看上去有多個值,但在任何版本的HTML定義中都沒有被定義爲多值屬性, 70 那麼BeautifulSoup會將這個屬性做爲字符串返回。以下↓ 71 ''' 72 id_soup = Beautiful('<p id="my id"></p>') 73 id_soup.p['id'] 74 # 'my id' 75 ''' 76 將tag轉換爲字符串時,多值屬性會合併爲一個值 77 ''' 78 rel_soup = BeautifulSoup('<p>Back to the <a rel="index">homepage</a></p>') 79 rel_soup.a['rel'] 80 # ['index'] 81 rel_soup.a['rel'] = ['index','contents']#給a標籤的rel屬性添加值,轉化在html裏就是空格鏈接 82 print(rel_soup.p) 83 # <p>Back to the <a rel="index contents">homepage</a></p> 84 ''' 85 若是轉換的文檔是XML格式,那麼tag中不包含多值屬性 86 ''' 87 xml_soup = BrautifulSoup('<p class="body strikeout"></p>','xml')#lxml有多值屬性,xml沒有 88 xml_soup.p['class'] #xml裏的class屬性值輸出出來仍然是(如非多值屬性的)字符串形式,而非列表 89 # u'body strikeout' 90 91 92 #能夠遍歷的字符串 93 ''' 94 字符串常被包含在tag內,BeautifulSoup用 NavigableString 類來包裝tag中的字符串: 95 ''' 96 tag.string 97 # u'Extremely bold' 98 type(tag.string) 99 # <class 'bs4.element.NavigableString'> 100 ''' 101 一個 NavigableString 字符串與Python中的Unicode字符串相同, 102 而且還支持包含在遍歷文檔樹和搜索文檔樹中的一些特性, 103 經過unicode()方法能夠直接將 NavigableString 對象轉換成 Unicode 字符串: 104 ''' 105 unicode_string = unicode(tag.string) 106 unicode_string 107 # u'Extremely bold' 108 type(unicode_string) 109 # <type 'unicode'> 110 ''' 111 tag中包含的字符串不能編輯,可是能夠被替換成其它的字符串,用replace_with()方法: 112 '''