Beautiful Soup使用
Beautiful Soup
官方文檔是一個(gè)HTML/XML
的解析器纳令,主要的功能是如何解析和提取HTML/XML
數(shù)據(jù);
lxml
只會(huì)局部遍歷,而Beautiful Soup
是基于HTML DOM
的厦酬,會(huì)載入整個(gè)文檔刺彩,解析整個(gè)DOM
樹(shù),因此解析時(shí)間和內(nèi)存開(kāi)銷(xiāo)都會(huì)大很多嘿般,所以性能要低于lxml
;
BeautifulSoup
用來(lái)解析HTML
比較簡(jiǎn)單活箕,API
非常人性化力麸,支持CSS
選擇器、Python
標(biāo)準(zhǔn)庫(kù)中的HTML
解析器育韩,也支持lxml
的XML
解析器;
安裝
pip install beautifulsoup4
1.語(yǔ)法
創(chuàng)建soup對(duì)象
from bs4 import BeautifulSoup
# html為解析文本克蚂, 'lxml'指定解析器
soup = BeautifulSoup(html, 'lxml')
# 格式化輸出 soup 對(duì)象的內(nèi)容
print(soup.prettify())
一、find_all()使用
參數(shù): find_all(name, attrs, recursive, text, **kwargs)
**
1)name
參數(shù)
name 參數(shù)可以查找所有名字為 name 的tag,字符串對(duì)象會(huì)被自動(dòng)忽略掉
A.字符串
最簡(jiǎn)單的過(guò)濾器是字符串筋讨,在搜索方法中傳入一個(gè)字符串參數(shù)埃叭,Beautiful Soup
會(huì)查詢(xún)與字符串完整匹配的內(nèi)容;
# 查詢(xún)標(biāo)簽名稱(chēng)為<p></p>標(biāo)簽的元素列表
soup.find_all('p')
B.正則
如果傳入正則表達(dá)式作為參數(shù),Beautiful Soup會(huì)通過(guò)正則表達(dá)式的 match() 來(lái)匹配內(nèi)容.下面例子中找出所有以b開(kāi)頭的標(biāo)簽,這表示和標(biāo)簽都應(yīng)該被找到
soup.find_all(re.compile(r'^b'))
C.列表
如果傳入列表參數(shù),Beautiful Soup會(huì)將與列表中任一元素匹配的內(nèi)容返回
# 查詢(xún)html中標(biāo)簽名稱(chēng)為<p></p>或者<b></b>的元素
soup.find_all(["p", "b"])
2) keyword
參數(shù)
# 查詢(xún)<p></p>標(biāo)簽對(duì)象的class屬性是title的元素
soup.find_all('p',attrs={'class':'title'})
3)text
參數(shù)
通過(guò) text 參數(shù)可以搜索文檔中的字符串內(nèi)容,與 name 參數(shù)的可選值一樣, text 參數(shù)接受 字符串 , 正則表達(dá)式 , 列表
soup.find_all(text="Elsie")
soup.find_all(text=["Tillie", "Elsie", "Lacie"])
soup.find_all(text=re.compile("Dormouse"))
二悉罕、find
使用
find的用法與find_all一樣赤屋,區(qū)別在于find返回 第一個(gè)符合匹配結(jié)果立镶,find_all則返回 所有匹配結(jié)果的列表
三、 CSS
選擇器
CSS選擇器與 find_all 方法有異曲同工之妙的查找方法类早,也是返回所有匹配結(jié)果的列表媚媒。
- 寫(xiě) CSS 時(shí),標(biāo)簽名不加任何修飾莺奔,類(lèi)名前加.欣范,id名前加#
- 在這里我們也可以利用類(lèi)似的方法來(lái)篩選元素,用到的方法是 soup.select()令哟,返回類(lèi)型是 list
(1)通過(guò)標(biāo)簽選擇器查找
soup.select('title')
# 結(jié)果-->[<title>The Dormouse's story</title>]
(2)通過(guò)類(lèi)選擇器查找
soup.select('.title')
# 結(jié)果-->[<p class="title" name="dromouse"><b>The Dormouse's story</b></p>]
(3)通過(guò)id選擇器查詢(xún)
soup.select('#link1')
# 結(jié)果-->[<a class="sister" id="link1"><!-- Elsie --></a>]
(4)層級(jí)選擇器查詢(xún)
soup.select('p #link1')
# 結(jié)果-->[<a class="sister" id="link1"><!-- Elsie --></a>]
(5)通過(guò)屬性選擇器
soup.select("a[class='sister']")
(6)get_text()
獲取文本內(nèi)容
以上的 select 方法返回的結(jié)果都是列表形式,可以遍歷形式輸出妨蛹,然后用 get_text() 方法來(lái)獲取它的內(nèi)容
(7)獲取屬性
# 創(chuàng)建Beautiful Soup對(duì)象
soup = BeautifulSoup(html, 'lxml')
# 打印<a></a>標(biāo)簽的href屬性
print(soup.select('a')[0].get('href'))
print(soup.find('a').get('href'))
print(soup.find_all('a')[0].get('href'))
print(soup.find('p').get('name'))
# 打印結(jié)果
http://example.com/elsie
http://example.com/elsie
http://example.com/elsie
dromouse
2. bs4的四大對(duì)象
Beautiful Soup
將復(fù)雜HTML文檔轉(zhuǎn)換成一個(gè)復(fù)雜的樹(shù)形結(jié)構(gòu),每個(gè)節(jié)點(diǎn)都是Python對(duì)象,所有對(duì)象可以歸納為4種:
Tag
NavigableString
BeautifulSoup
Comment
代碼展示
# 創(chuàng)建Beautiful Soup對(duì)象
soup = BeautifulSoup(html, 'lxml')
# 打印獲取的對(duì)象類(lèi)型
print(type(soup.a))
print(type(soup.p.string))
print(type(soup))
print(type(soup.a.string))
打印結(jié)果
<class 'bs4.element.Tag'>
<class 'bs4.element.NavigableString'>
<class 'bs4.BeautifulSoup'>
<class 'bs4.element.Comment'>
3.遍歷文檔樹(shù)
3.1 獲取子節(jié)點(diǎn):.contents
,.children
屬性
3.1.1 .content
tag的.content屬性可以將tag的子節(jié)點(diǎn)以列表方式輸出
# 創(chuàng)建Beautiful Soup對(duì)象
soup = BeautifulSoup(html, 'lxml')
# 把soup對(duì)象中第一個(gè)<p></p>標(biāo)簽的子節(jié)點(diǎn)以列表形式輸出
print(soup.p.contents)
輸出結(jié)果
[<b>The Dormouse's story</b>, <a>3</a>]
3.1.2.children
它返回的不是一個(gè) list屏富,不過(guò)我們可以通過(guò)遍歷獲取所有子節(jié)點(diǎn)。
我們打印輸出 .children 看一下蛙卤,可以發(fā)現(xiàn)它是一個(gè) list 生成器對(duì)象
soup.p.children
<list_iterator object at 0x000002ADD46B95F8>