Beautiful Soup 4.2.0 doc_tag、Name、Attributes、多值屬性


找到了bs4的中文文檔,對昨天爬蟲程序里所涉及的bs4庫進行學習。這篇代碼涉及到tag、Name、Attributes以及多值屬性。

  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 '''

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM