2020-04-13 BeautifulSoup庫(基礎(chǔ))

是什么?

用于對html、xml進行解析并提取解析內(nèi)容的相關(guān)工具。

語法

from bs4 import BeautifulSoup    #引用方式:從bs4庫中引入了一個類型叫BeautifulSoup
soup = BeautifulSoup('<p>data</p>', 'html.parser')

也可直接引用bs4庫

import bs4

第一行的BeautifulSoup是一個類袖瞻,要用BeautifulSoup做一鍋湯命名為soup。

兩個參數(shù):
①需要BeautofulSoup解析的一個html格式的信息
②解析這鍋湯使用的解析器

基本元素

BeautifulSoup對應(yīng)一個HTML/XML文檔的全部內(nèi)容拆吆。

任何存在于html語法的標簽聋迎,都可以使用soup.tag方式獲得
soup.tag默認獲得第一個滿足要求的標簽

基本元素 說明
Tag 標簽,最基本的信息組織單元(與html和xml文檔中的一對<></>相對應(yīng))锈拨,分別用<></>標明開頭和結(jié)尾
Name 標簽的名字砌庄,<p>...</p>的名字是'p',格式:<tag>.name(獲取標簽名字)
Attributes 標簽的屬性奕枢,字典形式組織娄昆,格式:<tag>.attrs(獲取標簽屬性)
NavigableString 標簽內(nèi)非屬性字符串,<>..</>中字符串缝彬,格式:<tag>.string(獲取其中的字符串)
Comment 標簽內(nèi)字符串的注釋部分萌焰,一種特殊的Comment類型
  • Name實例
>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup(demo, "html.parser")
>>> soup.a.name #獲得標簽a的名字
'a'   
>>> soup.a.parent.name #獲得標簽a的父親的名字(即包含a標簽的上一層標簽)
'p'
>>> soup.p.parent.name#獲得標簽p的父親
'body'

如上:標簽名字以字符串形式顯示

  • Attributes實例

由于標簽的屬性是字典形式,則可以采用字典的方式對每個信息做信息提取

>>> tag = soup.a
>>> tag.attrs
{'href': 'http://www.icourse163.org/course/BIT-268001', 'class': ['py1'], 'id': 'link1'}
>>> tag.attrs['class']  #獲得class屬性的值:是個列表谷浅,列表中第一個值為‘py1’
['py1']
>>> tag.attrs['href']  #獲得a標簽的鏈接屬性(‘href’)
'http://www.icourse163.org/course/BIT-268001'
>>> type(tag.attrs)  #查看標簽屬性的類型
<class 'dict'>
>>> type(tag)  #查看標簽類型具體怎么定義的
<class 'bs4.element.Tag'>
#在bs4中將標簽定義了一個特殊的類型
>>> 

無論tag中有無屬性都可以獲得一個字典

  • NavigableString實例
>>> soup.a
<a class="py1"  id="link1">Basic Python</a>
>>> soup.a.string
'Basic Python'
>>> soup.p
<p class="title"><b>The demo python introduces several python courses.</b></p>
>>> soup.p.string
'The demo python introduces several python courses.'
>>> type(soup.p.string)
<class 'bs4.element.NavigableString'>
>>> 

【注意】:soup.p 打印結(jié)果中在p標簽中間還有b標簽扒俯,但是soup.p.string返回結(jié)果中并無b標簽。這說明NavigableString是可以跨越多個層次

  • Comment實例
    燉了一鍋新湯一疯,b標簽中給出了一個注釋,p標簽中并不是一個注釋撼玄。
    而返回結(jié)果b標簽與p標簽均返回一段文本,但這個文本是注釋形式時他并沒有標明自己是注釋墩邀,這就說明<!- ->被去掉了掌猛,所以在分析文檔時需要對其中的注釋部分做相應(yīng)的判斷,判斷依據(jù)就是他的類型眉睹。
>>> newsoup = BeautifulSoup("<b><!--This is a comment--></b><p>This is not a comment</p>", "html.parser")
>>> newsoup.b.string
'This is a comment'
>>> type(newsoup.b.string)
<class 'bs4.element.Comment'>
>>> newsoup.p.string
'This is not a comment'
>>> type(newsoup.p.string)
<class 'bs4.element.NavigableString'>
>>> 

圖片加深理解@蟛纭!竹海!

BeautifulSoup庫理解

BeautifulSoup庫解析器

解析器 使用方法 條件
bs4的HTML解析器 BeautifulSoup(mk,'html.parsr') 安裝bs4庫
lxml的HTML解析器 BeautifulSoup(mk,'lxml') pip install lxml
lxml的xml解析器 BeautifulSoup(mk,'xml') pip install lxml
html5lib的解析器 BeautifulSoup(mk,'html5lib') pip install html5lib

bs4庫的各種神仙方法

prettify()方法

為html文本的標簽與內(nèi)容增加換行符慕蔚,也可以對每一個標簽進行處理(可將內(nèi)容清晰漂亮的打印出來)輔助作用強大。

find_all()方法

返回一個列表類型斋配,存儲查找的結(jié)果孔飒。

簡寫形式:
<tag>(..)等價于<tag>.find_all(..)

如: soup(..) 等價于 soup.find_all(..)

<>.find_all(name, attrs, rescursive, string, **kwargs)

name:對標簽名稱的檢索字符串

#檢索所有的a標簽
>>> soup.find_all('a') 
[<a class="py1"  id="link1">Basic Python</a>, <a class="py2"  id="link2">Advanced Python</a>]

#檢索所有的a標簽和b標簽(a灌闺,b標簽以列表的形式傳入)
>>> soup.find_all(['a','b']) 
[<b>The demo python introduces several python courses.</b>, <a class="py1"  id="link1">Basic Python</a>, <a class="py2"  id="link2">Advanced Python</a>]

#給出標簽名稱是True,則顯示當前soup的所有標簽信息
>>> for tag in soup.find_all(True):
    print(tag.name)
    
html
head
title
body
p
b
p
a
a
>>> 

#查找以b開頭的所有標簽十偶,需要用到正則表達式
#正則表達式庫所返回的結(jié)果是指以b開頭的所有信息作為查找的要素
>>> import re
>>> for tag in soup.find_all(re.compile('b')):
    print(tag.name)
    
body
b
>>> 

attrs:對標簽屬性值的檢索字符串菩鲜,可標注屬性檢索。

#對屬性賦值進行查找的時候惦积,需要精確的賦值該信息
#若想查找包含xxx的信息,仍需要正則表達式的輔助
>>> soup.find_all(id = 'link')
[]
>>> soup.find_all(id = 'link1')
[<a class="py1"  id="link1">Basic Python</a>]

#可以找到id以link開頭猛频,不一定與link完全一致的標簽信息
>>> import re
>>> soup.find_all(id = re.compile('link'))
[<a class="py1"  id="link1">Basic Python</a>, <a class="py2"  id="link2">Advanced Python</a>]

recursive:是否對子孫全部檢索狮崩,默認為True
若只想搜索兒子節(jié)點層面上的信息,則可設(shè)置為False

>>> soup.find_all('a')
[<a class="py1"  id="link1">Basic Python</a>, <a class="py2"  id="link2">Advanced Python</a>]
>>> soup.find_all('a', recursive = False)
[]

string:<>..</>中字符串區(qū)域進行檢索的字符串參數(shù)鹿寻。
進行文本檢索時使用正則表達式睦柴,結(jié)合find_all()函數(shù)可以在html、xml中輕松檢索所需要的信息或所需要信息的相關(guān)區(qū)域(毡熏?坦敌??區(qū)域這個咋搞)痢法。

>>> soup.find_all(string = "Basic Python")
['Basic Python']
>>> soup.find_all(string = re.compile('python'))
['This is a python demo page', 'The demo python introduces several python courses.']
>>> 

find_all()的擴展方法們

擴展方法

bs4庫的編碼問題

bs4庫將讀入的html文件或字符串都轉(zhuǎn)化成了UTF-8編碼狱窘,可以很好的支持中文等第三方語言。

>>> soup = BeautifulSoup("<p>中文</p>"财搁,"html.parser")
SyntaxError: invalid character in identifier
>>> soup = BeautifulSo up("<p>中文</p>","html.parser")
>>> soup.p.string
'中文'
>>> print(soup.p.prettify())
<p>
 中文
</p>
>>> 
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蘸炸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子尖奔,更是在濱河造成了極大的恐慌搭儒,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件提茁,死亡現(xiàn)場離奇詭異淹禾,居然都是意外死亡,警方通過查閱死者的電腦和手機茴扁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門铃岔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人丹弱,你說我怎么就攤上這事德撬。” “怎么了躲胳?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵蜓洪,是天一觀的道長。 經(jīng)常有香客問我坯苹,道長隆檀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮恐仑,結(jié)果婚禮上泉坐,老公的妹妹穿的比我還像新娘。我一直安慰自己裳仆,他們只是感情好腕让,可當我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著歧斟,像睡著了一般纯丸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上静袖,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天觉鼻,我揣著相機與錄音,去河邊找鬼队橙。 笑死坠陈,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的捐康。 我是一名探鬼主播仇矾,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼吹由!你這毒婦竟也來了若未?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤倾鲫,失蹤者是張志新(化名)和其女友劉穎粗合,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乌昔,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡隙疚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了磕道。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片供屉。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖溺蕉,靈堂內(nèi)的尸體忽然破棺而出伶丐,到底是詐尸還是另有隱情,我是刑警寧澤疯特,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布哗魂,位于F島的核電站,受9級特大地震影響漓雅,放射性物質(zhì)發(fā)生泄漏录别。R本人自食惡果不足惜朽色,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望组题。 院中可真熱鬧葫男,春花似錦、人聲如沸崔列。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赵讯。三九已至利职,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瘦癌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工跷敬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留讯私,地道東北人。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓西傀,卻偏偏與公主長得像斤寇,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子拥褂,可洞房花燭夜當晚...
    茶點故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內(nèi)容