爬蟲庫之BeautifulSoup學習(二)
BeautifulSoup官方介紹文檔:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html
四大對象種類:
BeautifulSoup 將復雜的html文件轉換成一個復雜的樹形結松,每個節點都是python對象。
所有對象可以分下以下四類:
Tag
NavigableString
BeautifulSoup
Comment
下面進行一一介紹:
1、Tag
通俗點講就是html中的一個個標簽,例如:
<title>Hello world </title>
<a class ="test",href="http://www.baidu.com" id="link1"> Elsie </a>
上面的 title a 等等 HTML 標簽加上裏面包括的內容就是 Tag,下面我們來感受一下怎樣用 Beautiful Soup 來方便地獲取 Tags
下面每一段代碼中註釋部分為運行結果:
print soup.title
#<title>Hello world </title>
print soup.head
#<head><title>The Dormouse‘s story</title></head>
print soup.a
#<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>
print soup.p
#<p class="title" name="dromouse"><b>The Dormouse‘s story</b></p>
我們可以利用 soup加標簽名輕松地獲取這些標簽的內容,是不是感覺比正則表達式方便多了?
我們可以驗證一下這些對象的類型:
print type(soup.a)
#<class ‘bs4.element.Tag‘>
對於tag,它有兩個重要的屬性,是name和attrs
name:
print soup.name
print soup.head.name
#[document]
#head soup 對象本身比較特殊,它的 name 即為 [document],對於其他內部標簽,輸出的值便為標簽本身的名稱。 attrs print soup.p.attrs #{‘class‘: [‘title‘], ‘name‘: ‘dromouse‘} //得到類型是一個字典 如果我們想要單獨獲取某個屬性,可以這樣: print soup.p[‘class‘] #[‘title‘] 還可以這樣,得用get方法,傳入屬性的名稱,二者是等價的: print soup.p.get(‘class‘) #[‘title‘]
2、NaviableString
既然我們已經得到了標簽的內容,那麽問題來了,我們要想獲取標簽內部的文字怎麽辦呢?很簡單,用 .string 即可
print soup.p.string
#The Dormouse‘s story
檢查一下它的類型
print type(soup.p.string)
#<class ‘bs4.element.NavigableString‘>
3、BeautifulSoup
對象表示的是一個文檔的全部內容.大部分時候,可以把它當作 Tag 對象,是一個特殊的 Tag,我們可以分別獲取它的類型,名稱,以及屬性來感受一下
print type(soup.name)
#<type ‘unicode‘>
print soup.name
#[document]
print soup.attrs
#{} 空字典
4、Comment
對象是一個特殊類型的 NavigableString 對象,其實輸出的內容仍然不包括註釋符號,但是如果不好好處理它,可能會對我們的文本處理造成意想不到的麻煩。
我們找一個帶註釋的標簽
print soup.a
print soup.a.string
print type(soup.a.string)
結果如下:
<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>
Elsie
<class ‘bs4.element.Comment‘>
a 標簽裏的內容實際上是註釋,但是如果我們利用 .string 來輸出它的內容,我們發現它已經把註釋符號去掉了,所以這可能會給我們帶來不必要的麻煩。
另外我們打印輸出下它的類型,發現它是一個 Comment 類型,所以,我們在使用前最好做一下判斷,判斷代碼如下:
if type(soup.a.string)=="bs4.element.Comment":
print soup.a.string
上面的代碼中,我們首先判斷了它的類型,是否為 Comment 類型,然後再進行其他操作,如打印輸出。
爬蟲庫之BeautifulSoup學習(二)