【python&爬蟲】快速入門BeautifulSoup解析器

一.基本介紹

目前流行使用的是beautifulSoup4(BeautifulSoup4簡稱bs4)開發bs4是一個HTML/XML的解析器,其主要功能是解析和提取HTML/XML數據。它不僅支持CSS選擇器,而且支持python標準庫中的HTML解析器,以及lxml的XML解析器

1.節點對象分類

bs4庫將複雜的HTML文檔轉換成樹結構(HTML DOM),這個結構中每個節點都是一個python對象,分類如下:

對象 說明
bs4.element.Tag類 表示HTML中的標籤,是最基本的信息組織單元,它有兩個非常重要的屬性,分別是表示標籤名字的name屬性和表示標籤屬性的attrs屬性
bs4.element.NavigableString類 表示HTML中標籤的文本(非屬性字段)
bs4.BeautifulSoup類 表示HTML DOM中的全部內容,支持遍歷文檔樹和搜索文檔樹的大部分方法
bs4.element.Comment類 表示標籤內字符串的註釋部分,是一種特殊的NavigableString對象

2.使用bs4的流程

(1)創建一個BeautifulSoup對象
(2)通過BeautifulSoup的操作方法進行解讀搜索
    根據DOM樹進行各種節點的搜索,例如,find_all()方法可以搜索出所有滿足要求的節點
    find方法只會搜索出第一個滿足要求的節點,只要獲得了一個節點,就可以訪問節點名稱,屬性和文本
(3)利用DOM樹結構標籤的特性,進行更爲詳細的節點信息提取

二.構建BeautifulSoup類

1.BeautifulSoup類構造方法解析

def __init__(
        self,
        markup="",  表示要解析的文檔字符串或文檔對象
        features=None,  表示解析器的名稱
        builder=None,   表示指定的解析器
        parse_only=None,
        from_encoding=None,         表示指定的編碼格式
        exclude_encodings=None,     表示排除的編碼格式
        **kwargs
        )      

2.創建BeautifulSoup對象

注意:如果沒有指定解析器,那麼BeautifulSoup對象會根據當前系統安裝的庫自動選擇解析器 解析器選擇順序爲:lxml html5lib python標準庫

from bs4 import BeautifulSoup
# str表示被解析HTML文檔的字符串,lxml表示使用lxml解析器
soup = BeautifulSoup(str,lxml)

3.prettify()方法
使用prettify()方法輸出剛創建的BeautifulSoup對象soup

print(soup.prettify())

4.常用的兩個方法

可以這些方法獲取文本和標籤屬性
(1)find() 用於查找符合條件的第一個標籤的節點
(2)find_all() 用於查找所有符合條件的標籤節點,並返回一個列表

5.find_all()方法解析

 find_all()方法參數解析:
                def find_all(self,
                name=None,  查找所有名字爲name的標籤,但是字符串會被自動忽略
                            1.傳入字符串,BeautifulSoup對象會查找與字符串完全匹配的內容
                            2.傳入正則表達式,BeautifulSoup對象會通過re模塊match()進行匹配
                            3.傳入列表,BeautifulSoup對象會將與列表中任一元素匹配的內容返回

                attrs={},   如果某個指定名字的參數不是搜索方法中內置的參數名,那麼在進行搜索時,會把
                            該參數當作指定名稱的標籤中的屬性來搜索
                            1.soup.find_all(id="link") 會搜索每個標籤的id屬性
                            2.如果要搜索的標籤名稱爲class,由於class屬於python中的關鍵字,所有class後面要加一個下劃線
                            3.如果參數中包含特殊符號,可以將參數寫成字典類型 soup.find_all(attrs={"data-foo":"value"})

                recursive=True, 在調用find_all()方法時,BeautifulSoup對象會檢索當前節點的所有子節點。這時,
                                如果只想搜索當前節點的直接子節點,就可以使用recursive = False

                text=None,  傳入text參數,可以搜索文檔中的字符串內容。與name參數可選值一樣,text參數可以接受字符串
                            正則表達式,列表等

                limit=None, 可以使用limit參數來限制返回結果的數量,其效果和SQL中的效果類似

                 **kwargs)

6.快速體驗BeautifulSoup小案例

案例說明:爬取古詩文大全7個頭標題和對應的href
知識點: 1.獲取標籤中的文本 。2.獲取標籤中的屬性
這些就是我們爬取的目標
在這裏插入圖片描述
在這裏插入圖片描述

import requests
from bs4 import BeautifulSoup

url = "https://so.gushiwen.org/shiwen/"
response = requests.get(url)
soup = BeautifulSoup(response.text,"lxml")

# 傳入標籤名和classs屬性,返回一個可遍歷集合
son1 = soup.find_all("div",class_="son1")
for item in son1:
    # 查找每個item中a標籤
    a = item.find_all('a')
    for i in a: # 這裏 a 是一個結果集 可以遍歷
        # print(type(i))  #<class 'bs4.element.Tag'>
        # get_text() 方法可以獲取標籤內的所有文本內容
        title = i.get_text()

        # 獲取href屬性值,因爲 i 是一個bs4.element.Tag對象,前面已經介紹,所以可以直接獲取屬性
        href = i['href']
        # 打印輸出
        print(title+"  ==href==>  "+href)

輸出結果
在這裏插入圖片描述

三.CSS選擇器

CSS(Cascading Style Sheets)層疊樣式表,是一種用來表現HTML或XML等文件樣式的計算機語言,它不僅可以靜態的修飾網頁,而且可以配合各種腳本語言動態地對網頁各元素進行格式化

1.通過標籤名查找

在編寫CSS時,標籤的名稱不用加任何修飾。調用select()方法時,可以傳入包含某個標籤的字符串 實例:

soup.select("title")

2.通過類名查找

在編寫CSS時,需要在類名的前面加上"." 例如查找類名sister的類名,即class=“sister”

soup.select(".sister")

3.通過ID名查找

在編寫CSS時,需要在id名稱前面加上 # 例如查找id名爲link1的標籤 即id=“link1”

 soup.select("#link1")

4.通過組合的形式查找

組合查找與編寫class文件時,標籤名,類名,id名的組合原理一樣,二者之間需要用空格分開。例如:在標籤 p 中,查找id值等於link1的內容

soup.select("p #link1")
    可以使用 > 將標籤與子標籤分隔,從而找到某個標籤下的直接子標籤
    soup.select("head > title")

5.通過屬性進行查找

可以通過屬性元素進行查找,屬性需要用中括號括起來。但是屬性和標籤屬於同一節點,它們中間不能加空格,否則無法匹配到

soup.select("a[@href="/python/python-func-staticmethod.html"]")

6.CSS選擇器小案例

案例說明:爬取所有小標籤的標題和href
知識點: 1.使用CSS搜索指定標籤 。2.獲取標籤中的文本 。3.獲取標籤中的屬性
這是我們要爬取的內容
在這裏插入圖片描述
在這裏插入圖片描述
案例試驗

import requests
from bs4 import BeautifulSoup

url = "https://so.gushiwen.org/shiwen/"
response = requests.get(url)
soup = BeautifulSoup(response.text,"lxml")
# 使用css選擇器 a_list是list類型
# 搜索class="sright"的標籤的子標籤a
a_list = soup.select(".sright > a")
for a in a_list:
    # 跟上面的小案例大同小異
    title = a.get_text()
    href = a['href']
    print(title+"  ==href==>  "+href)

輸出結果
在這裏插入圖片描述

四.總結

1.從上面的案例可以看出,beautifulSoup4的API非常人性化,用起來非常簡單
2.beautifulSoup4是載入整個文檔,並轉換成整個樹結構。因此,beautifulSoup4需要花費更多的時間和內存,性能比較低。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章