這篇文章主要介紹“Python爬蟲解析器BeautifulSoup4怎么使用”的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“Python爬蟲解析器BeautifulSoup4怎么使用”文章能幫助大家解決問(wèn)題。
成都創(chuàng)新互聯(lián)公司自2013年起,先為德陽(yáng)等服務(wù)建站,德陽(yáng)等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為德陽(yáng)企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。
Beautiful Soup 是一個(gè)可以從HTML或XML文件中提取數(shù)據(jù)的Python庫(kù).它能夠通過(guò)你喜歡的轉(zhuǎn)換器實(shí)現(xiàn)慣用的文檔導(dǎo)航,查找,修改文檔的方式.Beautiful Soup會(huì)幫你節(jié)省數(shù)小時(shí)甚至數(shù)天的工作時(shí)間。
BeautifulSoup4將網(wǎng)頁(yè)轉(zhuǎn)換為一顆DOM樹(shù):
1. window電腦點(diǎn)擊win鍵+ R
,輸入:cmd
2. 安裝beautifulsoup4
,輸入對(duì)應(yīng)的pip命令:pip install beautifulsoup4
,我已經(jīng)安裝過(guò)了出現(xiàn)版本就安裝成功了
3. 導(dǎo)包
form bs4 import BeautifulSoup
BeautifulSoup在解析時(shí)實(shí)際上依賴解析器,它除了支持Python標(biāo)準(zhǔn)庫(kù)中的HTML解析器外,還支持一 些第三方解析器(比如lxml):
解析器 | 使用方法 | 優(yōu)勢(shì) | 劣勢(shì) |
---|---|---|---|
Python標(biāo)準(zhǔn)庫(kù) | BeautifulSoup(html,’html.parser’) | Python的內(nèi)置標(biāo)準(zhǔn)庫(kù)、執(zhí)行速度適中、文檔容錯(cuò)能力強(qiáng) | Python 2.7.3及Python3.2.2之前的版本文檔容錯(cuò)能力差 |
lxml HTML解析庫(kù) | BeautifulSoup(html,’lxml’) | 速度快、文檔容錯(cuò)能力強(qiáng) | 需要安裝C語(yǔ)言庫(kù) |
lxml XML解析庫(kù) | BeautifulSoup(html,‘xml' | 速度快、唯一支持XML的解析器 | 需要安裝C語(yǔ)言庫(kù) |
htm5lib解析庫(kù) | BeautifulSoup(html,’htm5llib’) | 最好的容錯(cuò)性、以瀏覽器的方式解析文檔、生成HTMLS格式的文檔 | 速度慢、不依賴外部擴(kuò)展 |
對(duì)于我們來(lái)說(shuō),我們最常使用的解析器是lxml HTML
解析器,其次是html5lib.
1. 讀取HTML字符串:
from bs4 import BeautifulSoup html = '''
Hello
2. 讀取HTML文件:
from bs4 import BeautifulSoup soup = BeautifulSoup(open('index.html'),'lxml')
3. 基本方法
from bs4 import BeautifulSoup html = '''
Hello
Beautiful Soup將復(fù)雜HTML文檔轉(zhuǎn)換成一個(gè)復(fù)雜的樹(shù)形結(jié)構(gòu),每個(gè)節(jié)點(diǎn)都是Python對(duì)象,所有對(duì)象可以歸納為4種: Tag , NavigableString , BeautifulSoup , Comment .
(1)Tag:Tag通俗點(diǎn)講就是HTML中的一個(gè)個(gè)標(biāo)簽,例如:
soup = BeautifulSoup('Extremely bold','lxml') tag = soup.b print(tag) print(type(tag))
輸出結(jié)果:
Extremely bold
Tag有很多方法和屬性,在 遍歷文檔樹(shù) 和 搜索文檔樹(shù) 中有詳細(xì)解釋.現(xiàn)在介紹一下tag中最重要的屬性: name
和attributes
:
name屬性:
print(tag.name) # 輸出結(jié)果:b # 如果改變了tag的name,那將影響所有通過(guò)當(dāng)前Beautiful Soup對(duì)象生成的HTML文檔: tag.name = "b1" print(tag) # 輸出結(jié)果:Extremely bold
Attributes屬性:
# 取clas屬性 print(tag['class']) # 直接”點(diǎn)”取屬性, 比如: .attrs : print(tag.attrs)
tag 的屬性可以被添加、修改和刪除:
# 添加 id 屬性 tag['id'] = 1 # 修改 class 屬性 tag['class'] = 'tl1' # 刪除 class 屬性 del tag['class']
(2)NavigableString:用.string
獲取標(biāo)簽內(nèi)部的文字:
print(soup.b.string)print(type(soup.b.string))
(3)BeautifulSoup:表示的是一個(gè)文檔的內(nèi)容,可以獲取它的類型,名稱,以及屬性:
print(type(soup.name)) #print(soup.name) # [document] print(soup.attrs) # 文檔本身的屬性為空
(4)Comment:是一個(gè)特殊類型的 NavigableString 對(duì)象,其輸出的內(nèi)容不包括注釋符號(hào)。
print(soup.b) print(soup.b.string) print(type(soup.b.string))
1.find_all(name, attrs, recursive, text, **kwargs)
(1)name 參數(shù):name 參數(shù)可以查找所有名字為 name 的tag,字符串對(duì)象會(huì)被自動(dòng)忽略掉
匹配字符串:查找與字符串完整匹配的內(nèi)容,用于查找文檔中所有的標(biāo)簽
a_list = soup.find_all("a")print(a_list)
匹配正則表達(dá)式:如果傳入正則表達(dá)式作為參數(shù),Beautiful Soup會(huì)通過(guò)正則表達(dá)式的 match() 來(lái)匹配內(nèi)容
# 返回所有表示和標(biāo)簽for tag in soup.find_all(re.compile("^b")): print(tag.name)
匹配列表:如果傳入列表參數(shù),Beautiful Soup會(huì)將與列表中任一元素匹配的內(nèi)容返回
# 返回所有所有標(biāo)簽和標(biāo)簽:soup.find_all(["p", "a"])
(2)kwargs參數(shù)
soup.find_all(id='link2')
(3)text參數(shù):通過(guò) text 參數(shù)可以搜搜文檔中的字符串內(nèi)容,與 name 參數(shù)的可選值一樣, text 參數(shù)接受 字符串 , 正則表達(dá)式 , 列表
# 匹配字符串 soup.find_all(text="a") # 匹配正則 soup.find_all(text=re.compile("^b")) # 匹配列表 soup.find_all(text=["p", "a"])
我們?cè)谑褂肂eautifulSoup解析庫(kù)時(shí),經(jīng)常會(huì)結(jié)合CSS選擇器來(lái)提取數(shù)據(jù)。
注意:以下講解CSS選擇器只選擇標(biāo)簽,至于獲取屬性值和文本內(nèi)容我們后面再講。
1. 根據(jù)標(biāo)簽名查找:比如寫一個(gè) li
就會(huì)選擇所有l(wèi)i 標(biāo)簽
, 不過(guò)我們一般不用,因?yàn)槲覀兌际蔷_到標(biāo)簽再提取數(shù)據(jù)的
from bs4 import BeautifulSoup html = '''
Hello
輸出結(jié)果:
[
2. 根據(jù)類名class查找。.1ine
, 即一個(gè)點(diǎn)加line,這個(gè)表達(dá)式選的是class= "line "
的所有標(biāo)簽,".”
代表class
print(soup.select(".panel_body"))
輸出結(jié)果:
3. 根據(jù)id查找。#box,即一個(gè)#和box表示選取id-”box "的所有標(biāo)簽,“#”代表id
print(soup.select("#list-1"))
輸出結(jié)果:
[
4. 根據(jù)屬性的名字查找。class屬性和id屬性較為特殊,故單獨(dú)拿出來(lái)定義一個(gè)". "
和“”
來(lái)表示他們。
比如:input[ name=“username”]這個(gè)表達(dá)式查找name= "username "的標(biāo)簽,此處注意和xpath語(yǔ)法的區(qū)別
print(soup.select('ul[ name="element"]'))
輸出結(jié)果:
[
5. 標(biāo)簽+類名或id的形式。
# 查找id為list-1的ul標(biāo)簽 print(soup.select('ul#list-1')) print("-"*20) # 查找class為list的ul標(biāo)簽 print(soup.select('ul.list'))
輸出結(jié)果:
[
6. 查找直接子元素
# 查找id="list-1"的標(biāo)簽下的直接子標(biāo)簽liprint(soup.select('#list-1>li'))
輸出結(jié)果:
[
7. 查找子孫標(biāo)簽
# .panel_body和li之間是一個(gè)空格,這個(gè)表達(dá)式查找id=”.panel_body”的標(biāo)簽下的子或?qū)O標(biāo)簽liprint(soup.select('.panel_body li'))
輸出結(jié)果:
[
8. 取某個(gè)標(biāo)簽的屬性
# 1. 先取到p = soup.select(".panel_body")[0]# 2. 再去下面的a標(biāo)簽下的href屬性print(p.select('a')[0]["href"])
輸出結(jié)果:
https://www.baidu.com
9. 獲取文本內(nèi)容有四種方式:
(a) string
:獲得某個(gè)標(biāo)簽下的文本內(nèi)容,強(qiáng)調(diào)-一個(gè)標(biāo)簽,不含嵌我。 返回-個(gè)字符串
# 1. 先取到p = soup.select(".panel_body")[0]# 2. 再去下面的a標(biāo)簽下print(p.select('a')[0].string)
輸出結(jié)果:
百度官網(wǎng)
(b) strings
:獲得某個(gè)標(biāo)簽下的所有文本內(nèi)容,可以嵌套。返回-一個(gè)生成器,可用list(生成器)轉(zhuǎn)換為列表
print(p.strings)print(list(p.strings))
輸出結(jié)果:
['\n', '\n', 'Foo', '\n', 'Bar', '\n', 'Jay', '\n', '\n', '\n', 'Foo', '\n', '百度官網(wǎng)', '\n', 'Bar', '\n', '\n']
(c)stripped.strings
:跟(b)差不多,只不過(guò)它會(huì)去掉每個(gè)字符串頭部和尾部的空格和換行符
print(p.stripped_strings)print(list(p.stripped_strings))
輸出結(jié)果:
['Foo', 'Bar', 'Jay', 'Foo', '百度官網(wǎng)', 'Bar']
(d) get.text()
:獲取所有字符串,含嵌套. 不過(guò)會(huì)把所有字符串拼接為一個(gè),然后返回
注意2:
前3個(gè)都是屬性,不加括號(hào);最后一個(gè)是函數(shù),加括號(hào)。
print(p.get_text())
輸出結(jié)果:
Foo Bar Jay Foo 百度官網(wǎng) Bar
關(guān)于“Python爬蟲解析器BeautifulSoup4怎么使用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。