1. 程式人生 > >爬蟲庫之BeautifulSoup學習(二)

爬蟲庫之BeautifulSoup學習(二)

不必要 baidu html left 官方 blank 正則 文本處理 比較

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,它有兩個重要的屬性,是nameattrs

  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學習(二)