使用前,像往常壹樣,安裝BeautifulSoup庫。說明如下:
其中文開發文檔:
BeautifulSoup庫是壹個強大的Python語言的XML和HTML解析庫。它提供了壹些簡單的功能來處理導航、搜索和修改分析樹等功能。
BeautifulSoup庫還可以自動將輸入文檔轉換為Unicode編碼,將輸出文檔轉換為UTF-8編碼。
所以在使用BeautifulSoup庫的過程中,不需要考慮開發中的編碼問題,除非妳解析的文檔本身並沒有指定編碼方法,這就需要在開發中進行編碼處理。
下面,我們來詳細介紹壹下BeautifulSoup庫的使用規則。
下面,我們來詳細介紹壹下BeautifulSoup庫的關鍵知識。
首先,BeautifulSoup庫中的壹個重要概念就是選擇壹個解釋器。因為它的底層依賴於所有這些解釋者,所以我們有必要了解他們。博主特意列了壹個表:
從上表來看,我們壹般使用爬蟲的lxml HTML解析器,不僅速度快,兼容性也很強,除了安裝C語言庫的缺點(不能叫缺點,應該叫麻煩)。
要使用BeautifulSoup庫,需要像其他庫壹樣導入,但是雖然安裝了beautifulsoup4,但是導入的名字不是beautifulsoup4,而是bs4。用法如下:
運行後,輸出文本如下:
基本用法很簡單,這裏就不贅述了。從現在開始,讓我們詳細學習BeautifulSoup庫的所有重要知識點。第壹個是節點選擇器。
所謂節點選擇器,就是直接通過名稱選擇壹個節點,然後使用string屬性獲取節點中的文本,這是最快的獲取方式。
比如在基本用法中,我們用h1直接獲取節點h1,然後通過h1.string就可以得到它的文本但是這種用法有壹個明顯的缺點,就是不適合復雜的層次。
因此,我們需要在使用節點選擇器之前收縮文檔。比如壹個文檔很大,但是我們得到的內容只有blog的id在P中,那麽我們先得到這個P,然後使用P裏面的節點選擇器是非常合適的。
HTML示例代碼:
在下面的例子中,我們仍然使用這個HTML代碼來解釋節點選擇器。
這裏先教大家如何獲取壹個節點的名稱屬性和內容。示例如下:
運行後,效果如下:
壹般來說,壹個節點的子節點可能有很多,用上面的方法只能得到第壹個。如果妳想得到壹個標簽的所有子節點,有兩種方法。讓我們先看看代碼:
運行後,效果如下:
如上面的代碼所示,我們有兩種方法可以得到所有的子節點,壹種是通過contents屬性,另壹種是通過children屬性,兩種遍歷的結果是壹樣的。
既然可以獲得直接子節點,當然也可以獲得所有的後代節點。BeautifulSoup庫為我們提供了descendants屬性來獲取後代節點。示例如下:
運行後,效果如下:
同樣,在實際的爬蟲程序中,我們有時需要反向尋找父節點或兄弟節點。
BeautifulSoup庫為我們提供了獲取父節點的parent屬性,獲取當前節點的下壹個兄弟節點的next_sibling屬性,獲取上壹個兄弟節點的previous_sibling屬性。
示例代碼如下:
運行後,效果如下:
對於節點選擇器,博主介紹過,用較少的文本內容完全可以做到。但是爬蟲爬出來的實際網址是大量的數據,開始使用節點選擇器並不合適。因此,我們應該考慮通過方法選擇器的第壹步。
find_all()方法主要用於根據節點的名稱、屬性和文本內容選擇所有符合要求的節點。其完整定義如下:
其實還是測試壹下上面的HTML吧。我們得到name=a的節點,attr={"class":"aaa"},文本等於text="Python plate "。
示例代碼如下:
運行後,效果如下:
find()和find_all()只有壹個區別,但結果有兩個區別:
1.find()只查找第壹個符合條件的節點,find_all()查找所有符合條件的節點。2.find()方法返回bs4.element.Tag對象,而find_all()返回bs4.element.ResultSet對象。
下面,讓我們在上面的HTML中尋找A標簽,看看返回的結果是否不同。示例如下:
運行後,效果如下:
首先,讓我們了解CSS選擇器的規則:
1 ...classname:選擇樣式名為classname的節點,即class屬性值為classname 2的節點。#idname:選擇id屬性為idname 3的節點,node name:選擇節點名為nodename的節點。
壹般來說,在BeautifulSoup庫中,我們使用函數select()來操作CSS選擇器。例子如下:
這裏,我們選擇class等於li1的節點。運行後,效果如下:
因為我們需要實現嵌套CSS選擇器的使用,但是上面的HTML不適合。在這裏,我們稍作修改,只是改變。