您好,登錄后才能下訂單哦!
小編給大家分享一下BeautifulSoup使用方法是什么,相信大部分人都還不怎么了解,因此分享這篇文章給大家學(xué)習(xí),希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去學(xué)習(xí)方法吧!
BeautifulSoup 的使用
我們學(xué)習(xí)了正則表達(dá)式的相關(guān)用法,但是一旦正則寫的有問題,可能得到的就不是我們想要的結(jié)果了,而且對于一個網(wǎng)頁來說,都有一定的特殊的結(jié)構(gòu)和層級關(guān)系,而且很多標(biāo)簽都有 id 或 class 來對作區(qū)分,所以我們借助于它們的結(jié)構(gòu)和屬性來提取不也是可以的嗎?
所以,這一節(jié)我們就介紹一個強大的解析工具,叫做 BeautiSoup,它就是借助網(wǎng)頁的結(jié)構(gòu)和屬性等特性來解析網(wǎng)頁的工具,有了它我們不用再去寫一些復(fù)雜的正則,只需要簡單的幾條語句就可以完成網(wǎng)頁中某個元素的提取。
廢話不多說,接下來我們就來感受一下 BeautifulSoup 的強大之處吧。
BeautifulSoup 簡介
簡單來說,BeautifulSoup 就是 Python 的一個 HTML 或 XML 的解析庫,我們可以用它來方便地從網(wǎng)頁中提取數(shù)據(jù),官方的解釋如下:
BeautifulSoup 提供一些簡單的、python 式的函數(shù)用來處理導(dǎo)航、搜索、修改分析樹等功能。它是一個工具箱,通過解析文檔為用戶提供需要抓取的數(shù)據(jù),因為簡單,所以不需要多少代碼就可以寫出一個完整的應(yīng)用程序。BeautifulSoup 自動將輸入文檔轉(zhuǎn)換為 Unicode 編碼,輸出文檔轉(zhuǎn)換為 utf-8 編碼。你不需要考慮編碼方式,除非文檔沒有指定一個編碼方式,這時你僅僅需要說明一下原始編碼方式就可以了。BeautifulSoup 已成為和 lxml、html6lib 一樣出色的 python 解釋器,為用戶靈活地提供不同的解析策略或強勁的速度。
所以說,利用它我們可以省去很多繁瑣的提取工作,提高解析效率。
安裝
使用之前,我們當(dāng)然需要首先說明一下它的安裝方式。目前 BeautifulSoup 的最新版本是 4.x 版本,之前的版本已經(jīng)停止開發(fā)了,推薦使用 pip 來安裝,安裝命令如下:
pip3 install beautifulsoup4
好,安裝完成之后可以驗證一下,寫一段 Python 程序試驗一下。
from bs4 import BeautifulSoup soup = BeautifulSoup('<p>Hello</p>', 'html.parser')print(soup.p.string)
運行結(jié)果
Hello
如果沒有報錯,則證明安裝沒有問題。
解析器
BeautifulSoup 在解析的時候?qū)嶋H上是依賴于解析器的,它除了支持 Python 標(biāo)準(zhǔn)庫中的 HTML 解析器,還支持一些第三方的解析器比如 lxml,下面我們對 BeautifulSoup 支持的解析器及它們的一些優(yōu)缺點做一個簡單的對比。
解析器使用方法優(yōu)勢劣勢
Python 標(biāo)準(zhǔn)庫 BeautifulSoup (markup, "html.parser") Python 的內(nèi)置標(biāo)準(zhǔn)庫、執(zhí)行速度適中 、文檔容錯能力強 Python 2.7.3 or 3.2.2) 前的版本中文容錯能力差
lxml HTML 解析器 BeautifulSoup (markup, "lxml") 速度快、文檔容錯能力強需要安裝 C 語言庫
lxml XML 解析器 BeautifulSoup (markup, "xml") 速度快、唯一支持 XML 的解析器需要安裝 C 語言庫
html5libBeautifulSoup (markup, "html5lib") 最好的容錯性、以瀏覽器的方式解析文檔、生成 HTML5 格式的文檔速度慢、不依賴外部擴展
所以通過以上對比可以看出,lxml 這個解析器有解析 HTML 和 XML 的功能,而且速度快,容錯能力強,所以推薦使用這個庫來進行解析,但是這里的劣勢是必須安裝一個 C 語言庫,它叫做 lxml,我們在這里依然使用 pip 安裝即可,命令如下:
pip3 install lxml
安裝完成之后,我們就可以使用 lxml 這個解析器來解析了,在初始化的時候我們可以把第二個參數(shù)改為 lxml,如下:
from bs4 import BeautifulSoup soup = BeautifulSoup('<p>Hello</p>', 'lxml') print(soup.p.string)
運行結(jié)果是完全一致的。
基本使用
下面我們首先用一個實例來感受一下 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>""" from bs4 import BeautifulSoup soup = BeautifulSoup(html, 'lxml') print(soup.prettify()) print(soup.title.string)
運行結(jié)果
<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 class="sister" href="http://example.com/elsie" id="link1"> <!-- Elsie --> </a> , <a class="sister" href="http://example.com/lacie" id="link2"> Lacie </a> and <a class="sister" href=" http://example.com/tillie" id="link3"> Tillie </a> ;and they lived at the bottom of a well. </p> <p class="story"> ... </p> </body></html>The Dormouse's story
首先我們聲明了一個變量 html,它是一個 HTML 字符串,但是注意到,它并不是一個完整的 HTML 字符串,<body> 和 <html> 標(biāo)簽都沒有閉合,但是我們將它當(dāng)作第一個參數(shù)傳給 BeautifulSoup 對象,第二個參數(shù)傳入的是解析器的類型,在這里我們使用 lxml,這樣就完成了 BeaufulSoup 對象的初始化,將它賦值給 soup 這個變量。
那么接下來我們就可以通過調(diào)用 soup 的各個方法和屬性對這串 HTML 代碼解析了。
我們首先調(diào)用了 prettify () 方法,這個方法可以把要解析的字符串以標(biāo)準(zhǔn)的縮進格式輸出,在這里注意到輸出結(jié)果里面包含了 </body> 和 </html> 標(biāo)簽,也就是說對于不標(biāo)準(zhǔn)的 HTML 字符串 BeautifulSoup 可以自動更正格式,這一步實際上不是由 prettify () 方法做的,這個更正實際上在初始化 BeautifulSoup 時就完成了。
然后我們調(diào)用了 soup.title.string,這個實際上是輸出了 HTML 中 <title> 標(biāo)簽的文本內(nèi)容。所以 soup.title 就可以選擇出 HTML 中的 <title> 標(biāo)簽,再調(diào)用 string 屬性就可以得到里面的文本了,所以我們就可以通過簡單地調(diào)用幾個屬性就可以完成文本的提取了,是不是非常方便?
標(biāo)簽選擇器
剛才我們選擇元素的時候直接通過調(diào)用標(biāo)簽的名稱就可以選擇節(jié)點元素了,然后再調(diào)用 string 屬性就可以得到標(biāo)簽內(nèi)的文本了,這種選擇方式速度非常快,如果單個標(biāo)簽結(jié)構(gòu)話層次非常清晰,可以選用這種方式來解析。
選擇元素
下面我們再用一個例子詳細(xì)說明一下它的選擇方法。
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>""" from bs4 import BeautifulSoup soup = BeautifulSoup(html, 'lxml') print(soup.title) print(type(soup.title)) print(soup.title.string) print(soup.head) print(soup.p)
運行結(jié)果
<title>The Dormouse's story</title><class 'bs4.element.Tag'>The Dormouse's story<head><title> The Dormouse's story</title></head><p class="title" name="dromouse"><b>The Dormouse's story</b></p>
在這里我們依然選用了剛才的 HTML 代碼,我們首先打印輸出了 title 標(biāo)簽的選擇結(jié)果,輸出結(jié)果正是 title 標(biāo)簽加里面的文字內(nèi)容。接下來輸出了它的類型,是 bs4.element.Tag 類型,這是 BeautifulSoup 中的一個重要的數(shù)據(jù)結(jié)構(gòu),經(jīng)過選擇器選擇之后,選擇結(jié)果都是這種 Tag 類型,它具有一些屬性比如 string 屬性,調(diào)用 Tag 的 string 屬性,就可以得到節(jié)點的文本內(nèi)容了,所以接下來的輸出結(jié)果正是節(jié)點的文本內(nèi)容。
接下來我們又嘗試選擇了 head 標(biāo)簽,結(jié)果也是標(biāo)簽加其內(nèi)部的所有內(nèi)容,再接下來選擇了 p 標(biāo)簽,不過這次情況比較特殊,我們發(fā)現(xiàn)結(jié)果是第一個 p 標(biāo)簽的內(nèi)容,后面的幾個 p 標(biāo)簽并沒有選擇到,也就是說,當(dāng)有多個標(biāo)簽時,這種選擇方式只會選擇到第一個匹配的標(biāo)簽,其他的后面的標(biāo)簽都會忽略。
提取信息
在上面我們演示了調(diào)用 string 屬性來獲取文本的值,那我們要獲取標(biāo)簽屬性值怎么辦呢?獲取標(biāo)簽名怎么辦呢?下面我們來統(tǒng)一梳理一下信息的提取方式
獲取名稱
可以利用 name 屬性來獲取標(biāo)簽的名稱。還是以上面的文本為例,我們選取 title 標(biāo)簽,然后調(diào)用 name 屬性就可以得到標(biāo)簽名稱。
print(soup.title.name)
運行結(jié)果
title
屬性獲取
每個標(biāo)簽可能有多個屬性,比如 id,class 等等,我們選擇到這個節(jié)點元素之后,可以調(diào)用 attrs 獲取所有屬性。
print(soup.p.attrs)print(soup.p.attrs['name'])
運行結(jié)果
{'class': ['title'], 'name': 'dromouse'}dromouse
以上是BeautifulSoup使用方法是什么的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。