是什么?
用于對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庫解析器
解析器 | 使用方法 | 條件 |
---|---|---|
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>
>>>