beautifulsoup的總結

Cosmop01itan發表於2017-01-26

html_doc="""

<html><head><title>TheDormouse'sstory</title></head>

 

<pclass="title"><b>TheDormouse'sstory</b></p>

 

<pclass="story">Onceuponatimetherewerethreelittlesisters;andtheirnameswere

<ahref="http://example.com/elsie"class="sister"id="link1">Elsie</a>,

<ahref="http://example.com/lacie"class="sister"id="link2">Lacie</a>and

<ahref="http://example.com/tillie"class="sister"id="link3">Tillie</a>;

andtheylivedatthebottomofawell.</p>

 

<pclass="story">...</p>

"""

Id過濾器的用法

1.soup.find_all(id='link2')#返回特定idtag物件
#[<a class="sister" href="http://example.com/lacie"id="link2">Lacie</a>]

2.

soup.find_all(id=True)#找到所有有id屬性的tag,返回的是tag物件的列表
# [<a class="sister"href="http://example.com/elsie"id="link1">Elsie</a>,
#  <aclass="sister" href="http://example.com/lacie"id="link2">Lacie</a>,
#  <aclass="sister" href="http://example.com/tillie"id="link3">Tillie</a>]

 

Href過濾器的用法

soup.find_all(href=re.compile("elsie"))//通過href來過濾元素
# [<a class="sister"href="http://example.com/elsie"id="link1">Elsie</a>]

Src圖片過濾器的用法

因為<img>tag 有個src屬性,所以就可以用src來獲取網頁所有的圖片啦

<imgsrc="http://image.ylyq.duoku.com/uploads/images/2016/1017/1476676420949247.jpg"width="150" height="200">

<imgsrc="http://image.ylyq.duoku.com/uploads/images/2016/0802/1470133017414468.png"width="150" height="200">

ele=soup.find_all(src=re.compile('http://image'))

也可以將上面的過濾器寫在一起:

soup.find_all(href=re.compile("elsie"), id='link1')
#[<a class="sister" href="http://example.com/elsie"id="link1">three</a>]

Soup.find_all(href=re.compile('http://'),id='someid',src='…')

以通過 find_all() 方法的 attrs 引數定義一個字典引數來搜尋包含特殊屬性的tag:

data_soup.find_all(attrs={"data-foo": "value",'class':'someclass'})
#[<div data-foo="value">foo!</div>]

#-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#

按照CSS類名搜尋tag的功能非常實用,但標識CSS類名的關鍵字 class Python中是保留字,使用 class 做引數會導致語法錯誤.Beautiful Soup4.1.1版本開始,可以通過 class_ 引數搜尋有指定CSS類名的tag:

soup.find_all("a", class_="sister")
#[<a class="sister" href="http://example.com/elsie"id="link1">Elsie</a>,
#  <a class="sister"href="http://example.com/lacie"id="link2">Lacie</a>,
#  <a class="sister"href="http://example.com/tillie"id="link3">Tillie</a>]

 

class_ 引數同樣接受不同型別的 過濾器 ,字串,正規表示式,方法或 True :

soup.find_all(class_=re.compile("itl"))
#[<p class="title"><b>The Dormouse'sstory</b></p>]

 

通過 text 引數可以搜搜文件中的字串內容. name 引數的可選值一樣text 引數接受 字串 , 正規表示式 , 列表True . 看例子:

soup.find_all(text=re.compile("Dormouse"))
[u"The Dormouse's story", u"The Dormouse's story"]

 

雖然 text 引數用於搜尋字串,還可以與其它引數混合使用來過濾tag.BeautifulSoup會找到 .string 方法與 text 引數值相符的tag.下面程式碼用來搜尋內容裡面包含“Elsie”<a>標籤:

soup.find_all("a", text="Elsie")
#[<a href="http://example.com/elsie" class="sister"id="link1">Elsie</a>]

find_all() 方法返回全部的搜尋結構,如果文件樹很大那麼搜尋會很慢.如果我們不需要全部結果,可以使用 limit 引數限制返回結果的數量.效果與SQL中的limit關鍵字類似,當搜尋到的結果數量達到 limit 的限制時,就停止搜尋返回結果.

文件樹中有3tag符合搜尋條件,但結果只返回了2,因為我們限制了返回數量:

soup.find_all("a", limit=2)
#[<a class="sister" href="http://example.com/elsie"id="link1">Elsie</a>,
#  <a class="sister"href="http://example.com/lacie"id="link2">Lacie</a>]

 

From <https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/#true