一、beautifulsoup4庫簡介
使用requests庫獲取HTML頁面並將其轉換成字符串后,需要進一步分析HTML頁面格式,提取有用信息,這個需要處理HTML和XML函數庫。
beautifulsoup4庫,也成為Beautiful Soup庫或者bs4庫,用於解析和處理HTML和XML。需要注意的是,他不是Beautifulsoup庫。它最大的優點是能根據HTML和XML語法建立解析樹,進而高效解析其中的內容。
HTML建立的web頁面一般是比較復雜的,除了有用的信息外,還包括大量的頁面格式信息元素,直接解析一個web網頁需要深入了解HTML語法。而beautifulsoup4庫將專業的web網頁格式解析部分封裝成函數,提供了若干有用快捷的處理函數。
二、beautifulsoup4庫使用
1. beautifulsoup4庫中最主要的是BeautifulSoup類,每個實例化的對象相當於一個頁面。
使用BeautifulSoup()創建一個BeautifulSoup對象:
創建的BeautifulSoup對象是一個樹形結構,它包含HTML頁面中的每一個Tag(標簽)元素,如<head>、<body>等。具體描述的話,是HTML中主要結構都變成了BeautifulSoup對象的一個屬性,
可以直接用<a>.<b>形式獲取,其中<b>的名字采用HTML中標簽的名字。
2. BeautifulSoup對象常用的屬性
head HTML頁面的<head>內容
title HTML頁面標題,在<head>中,由<title>標記
body HTML頁面的<body>內容
p HTML頁面中第一個<p>內容
strings HTML頁面所有呈現在web上的字符,即標簽的內容
stripped_strings HTML頁面所有呈現在web上的非空字符串
如略去<style>標簽輸出:
每一個Tag標簽在beautifulsoup4庫中都是一個對象,稱為Tag對象。例如,title是一個標簽對象。每一個標簽對象在HTML中都有類似的結構:
<a class=''mnav'' href="http://www.baidu.com">糯米</a>
其中,尖括號(<>)中標簽的名字是name,尖括號內其他項是attrs,尖括號之間的內容是string。因此,Tag對象有屬性name、attrs、string,並且采用<a>.<b>的語法形式
name 字符串標簽的名字,比如div
attrs 字典,包含了原來頁面Tag所有屬性,比如href
contents 列表,這個Tag下所有子Tag的內容
string 字符串,Tag所包圍的文本,網頁中真實的文字
如下:
由於HTML語法可以在標簽中嵌套其他標簽,所以string屬性的返回值遵循如下原則:
(1)如果標簽內部沒有其他標簽,string屬性返回其中內容。
(2)如果標簽內部還有其他標簽,但只有一個標簽,string屬性返回最里面的標簽內容。
(3)如果標簽內部有超過一層嵌套標簽,string屬性返回None(空字符串)
HTML語法中同一個標簽會有很多內容例如標簽<a>,百度首頁一共有13處,直接調用soup.a只能返回一個。當需要列出標簽對應所有內容或者需要找到非第一個標簽時,
需要用到BeautifulSoup的find()和find_all()方法。這兩個方法會遍歷到整個HTML文檔,按照條件返回標簽內容。
作用:根據參數找到標簽對象,返回列表類型。
參數如下:
name:按照Tag標簽名字檢索,名字用字符串形式表示,例如div、li;
attrs:按照Tag標簽屬性值檢索,需要列出屬性名稱和值,采用JSON表示;
recursive:設置查找層次,只查找當前標簽下一層時使用recursive=False;
string:按照關鍵字檢索string屬性內容,采用string=開始;
limit:返回結果的個數,默認返回全部結果;
如下:
簡單的說,BeautifulSoup的find_all()方法可以根據標簽名字、標簽屬性和內容檢索並返回標簽列表,通過片段字符串檢索時需要使用正則表達式re函數庫。當對標簽進行檢索時,
屬性和對應的值采用JSON格式,如:
‘src’:re.compile('jquery') 其中鍵值對中值的部分可以是字符串或者正則表達式。
僅用於Python學習筆記