Python網頁抓取工具Beautiful Soup面面觀!

shenmanli發表於2017-11-28
Beautiful Soup是python的一個庫,最主要的功能是從網頁抓取資料。提供一些簡單的、python式的函式,用來處理導航、搜尋、修改分析樹等功能。


Beautiful Soup是一個工具箱,通過解析文件為使用者提供需要抓取的資料。因為簡單,所以不需要多少程式碼,就可以寫出一個完整的應用程式。


Beautiful Soup自動將輸入文件轉換為Unicode編碼,輸出文件轉換為utf-8編碼。除非文件沒有指定一個編碼方式,這時Beautiful Soup就不能自動識別編碼方式了,但僅需要說明一下原始編碼方式就可以了。


Beautiful Soup已成為和lxml、html6lib一樣出色的python直譯器,為使用者靈活地提供不同的解析策略或強勁的速度。


Beautiful Soup 安裝


Beautiful Soup 3 目前已經停止開發,推薦在現在的專案中使用Beautiful Soup 4,不過它已經被移植到BS4了,也就是說匯入時需要import bs4 。如果你用的是新版的Debain或Ubuntu,那麼可以通過系統的軟體包管理來安裝。


Beautiful Soup支援Python標準庫中的HTML解析器,還支援一些第三方的解析器。如果不安裝它,則Python 會使用Python預設的解析器


建立Beautiful Soup 物件


首先必須要匯入bs4 庫


from bs4 import BeautifulSoup


先建立一個字串供使用


html = """


<html><head><title>The Dormouse's story</title></head>


<body>


<p class="title" name="dromouse"><b>The Dormouse's story</b></p>


<p class="story">Once upon a time there were three little sisters; and their names were


<a href="http://example.com/elsie" class="sister" id="link1"><!--Elsie --></a>,


<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and


<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;


and they lived at the bottom of a well.</p>


<p class="story">...</p>


"""


建立beautifulsoup物件


soup = BeautifulSoup(open('index.html'))


另外,還可以用本地HTML 檔案來建立物件,例如


print soup.prettify()


上面這句程式碼,便是將本地index.html 檔案開啟,用它來建立soup 物件


下面來列印一下soup 物件的內容,格式化輸出


print soup.prettify()


Beautiful Soup物件種類


Beautiful Soup將複雜HTML文件,轉換成一個複雜的樹形結構。


每個節點都是Python物件,所有物件可以歸納為4種:


(1)Tag


Tag 其實就是HTML 中的一個個標籤


例如


<title>The Dormouse's story</title>


&lt;aclass="sister" href="http://example.com/elsie" id="link1"&gt;Elsie&lt;/a&gt;


上面的title 、a 等等HTML 標籤加上裡面包括的內容就是Tag,用Beautiful Soup 來獲取Tags


print soup.title


print soup.head


print soup.a


print soup.p


print type(soup.a)


print soup.name


print soup.head.name


(2)NavigableString


如果已經得到了標籤的內容,要想獲取標籤內部的文字怎麼辦?


用.string 獲取內部文字


print soup.p.string


它的型別是一個NavigableString,其意思是可以遍歷的字串。


(3)BeautifulSoup


BeautifulSoup物件,表示的是一個文件的全部內容


很多時候可以把它當作一個特殊的Tag 物件


可以分別獲取它的型別,名稱,以及屬性


print type(soup.name)


print soup.name


print soup.attrs


(4)Comment


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 型別,在使用前最好做一下判斷


iftype(soup.a.string)==bs4.element.Comment:


print soup.a.string

相關文章