1. 程式人生 > >python3實現網路爬蟲(2)--BeautifulSoup使用(1)

python3實現網路爬蟲(2)--BeautifulSoup使用(1)

這一次我們來了解一下美味的湯--BeautifulSoup,這將是我們以後經常使用的一個庫,並且非常的好用。

BeautifuleSoup庫的名字取自劉易斯·卡羅爾在《愛麗絲夢遊仙境》裡的同名詩歌。在故事中,這首歌是素甲魚唱的。就像它在仙境中的說法一樣,BeautifulSoup嘗試化平淡為神奇。它通過定位HTML標籤來格式化和組織複雜的網路資訊,用簡單易用的Python物件為我們展現XML結構資訊。

由於BeautifulSoup庫不是Python標準庫,因此我們需要單獨安裝這個庫,才能使用它。對於這個庫的安裝,我們這裡秉著簡單的原則,就直接利用pycharm這個IDLE進行庫的自動下載和匯入。

首先我們進入pycharm的主介面,單擊file-〉settings-〉Project:untitled-〉Project Interpreter,如下圖:



在上圖中我們會看到一個綠色的加號,這時我們單擊這個加號,會跳出如下的介面(pycharm在這個地方有時候很慢,會一直在這個介面重新整理):


這時我們在搜尋框中輸入“bs4”,然後選擇列表中的bs4,然後進行安裝,如下圖:


這樣我們就完成了BeautifulSoup這個庫的安裝,下面我們就可以來使用它了。

關於這個庫的官方文件解釋的是很詳細的,一定要看一看:點選開啟連結

下面我就簡單說一下這個庫的一些方面。

首先呢,我們還是從一個例子開始我們的學習:

#coding:utf - 8
from urllib.request import urlopen
from bs4 import BeautifulSoup

html = urlopen("http://tieba.baidu.com/")
bsObj=BeautifulSoup(html,"lxml")    #將html物件轉化為BeautifulSoup物件
print(bsObj.title)   #輸出這個網頁中的標題 

執行上面的程式,我們會得到的結果為:<title>百度貼吧——全球最大的中文社群</title>
首先我們來分析下bsObj=BeautifulSoup(html,"lxml")這句話對我們的html做了什麼,在這句程式碼中,我們將html物件傳入到BeautifulSoup中將它轉化成BeautifulSoup物件,關於第二個引數lxml,可以到官方文件中看,解釋得很詳細,這裡大家只要知道帶上它就可以了,不需要管它。這樣,我們就成功將html物件轉化為了BeautifulSoup物件。
下面我們來了解下BeautifulSoup物件的結構,當我們將html轉化後得到的結構為:
html-><html><head>....</head><body>.....</body></html>
      ---head-><head><title>百度貼吧--全球最大的中文社群<title></head>

          ---title-><title>百度貼吧--全球最大的中文社群</title>

     ----body->.........

關於這個頁面的結構我中間省略了一些無關緊要的元素,只是為了展示下這種層次化的結構。
從上面我們可以看出,BeautifulSoup將html物件進行了層次化處理了,對它的原網頁的標籤進行了逐層的處理和細化,以便於我們之後使用。也就是我們只要知道,任何HTML(或XML)檔案的任意節點資訊都可以被提取出來,只要目標資訊的旁邊或者附近有標記就行了,這個標記就是我們網頁中使用到的各種div、li之類的標籤元素,也可以是class、id之類的屬性,通過這些我們都可以對需要的資訊進行提取。

對於剛剛的bsObj.title這個提取標題的操作,由於一個網頁中只有一個title,所以我們可以直接獲取到它,因為它是唯一的嘛,大家可以這樣理解,在一個學校中,你的學號是唯一的,我可以通過直接查詢學號進而唯一的搜尋你,而不會產生歧義。

對於bsObj.title我們有多重替代方案:

bsObj.html.head.title

bsObj.html.title

bsObj.head.title

關於上面的程式碼大家是對網頁中元素的細化搜尋,可以這樣理解啊,假定你已經知道一個人是計科院的了,那你搜索他的時候常規思路便是直接在計科院找他,而bsObj.head中的head就相當於計科院,它是網頁中的頭部,title就放在這裡面,所以我們使用bsObj.head.title也可以實現這個效果,其它的程式碼可以類似分析。

BeautifulSoup是一個物件,所以我們可以通過運算子“.”對它的屬性進行提取。

如bsObj.title獲取html的標題物件,bsObj.title.name獲取標題的名字。。。

這裡就先簡單介紹這些,後面 我們將繼續深入說明BeautifulSoup的好的使用方法。