爬蟲(chóng)_042_beautifulsoup的搜索文檔樹(shù)

1篙骡、find_all

find_all( name , attrs , recursive , string , **kwargs )

find_all() 方法搜索當(dāng)前tag的所有tag子節(jié)點(diǎn),并判斷是否符合過(guò)濾器的條件:

soup.find_all("title")
# [<title>The Dormouse's story</title>]

soup.find_all("a")
# [<a class="sister"  id="link1">Elsie</a>,
#  <a class="sister"  id="link2">Lacie</a>,
#  <a class="sister"  id="link3">Tillie</a>]

soup.find_all(id="link2")
# [<a class="sister"  id="link2">Lacie</a>]

import re
# 模糊查詢 包含sisters的就可以
soup.find(string=re.compile("sisters"))
# 'Once upon a time there were three little sisters; and their names were\n'

有幾個(gè)方法很相似,還有幾個(gè)方法是新的,參數(shù)中的 stringid 是什么含義? 為什么 find_all("p", "title") 返回的是CSS Class為”title”的<p>標(biāo)簽? 我們來(lái)仔細(xì)看一下 find_all() 的參數(shù).

1.1 name 參數(shù)

name 參數(shù)可以查找所有名字為 name 的tag,字符串對(duì)象會(huì)被自動(dòng)忽略掉.

簡(jiǎn)單的用法如下:

soup.find_all("title")
# [<title>The Dormouse's story</title>]

搜索 name 參數(shù)的值可以使任一類型的 過(guò)濾器 ,字符串,正則表達(dá)式,列表,方法或是 True .

<1> 傳字符串

最簡(jiǎn)單的過(guò)濾器是字符串.在搜索方法中傳入一個(gè)字符串參數(shù),Beautiful Soup會(huì)查找與字符串完整匹配的內(nèi)容,下面的例子用于查找文檔中所有的<b>標(biāo)簽

soup.find_all('b')
# [<b>The Dormouse's story</b>]

<2> 傳正則表達(dá)式

如果傳入正則表達(dá)式作為參數(shù),Beautiful Soup會(huì)通過(guò)正則表達(dá)式的 match() 來(lái)匹配內(nèi)容.下面例子中找出所有以b開(kāi)頭的標(biāo)簽,這表示<body>和<b>標(biāo)簽都應(yīng)該被找到

import re
for tag in soup.find_all(re.compile("^b")):
    print(tag.name)
# body
# b

<3> 傳列表

如果傳入列表參數(shù),Beautiful Soup會(huì)將與列表中任一元素匹配的內(nèi)容返回.下面代碼找到文檔中所有<a>標(biāo)簽和<b>標(biāo)簽

soup.find_all(["a", "b"])
# [<b>The Dormouse's story</b>,
#  <a class="sister"  id="link1">Elsie</a>,
#  <a class="sister"  id="link2">Lacie</a>,
#  <a class="sister"  id="link3">Tillie</a>]

1.2 keyword 參數(shù)

如果一個(gè)指定名字的參數(shù)不是搜索內(nèi)置的參數(shù)名,搜索時(shí)會(huì)把該參數(shù)當(dāng)作指定名字tag的屬性來(lái)搜索,如果包含一個(gè)名字為 id 的參數(shù),Beautiful Soup會(huì)搜索每個(gè)tag的”id”屬性.

soup.find_all(id='link2')
# [<a class="sister"  id="link2">Lacie</a>]

import re
# 超鏈接包含elsie標(biāo)簽
print(soup.find_all(href=re.compile("elsie")))
# [<a class="sister"  id="link1">Elsie</a>]
# 以The作為開(kāi)頭的字符串
print(soup.find_all(text=re.compile("^The"))) 
# ["The Dormouse's story", "The Dormouse's story"]
# class選擇器包含st的節(jié)點(diǎn)
print(soup.find_all(class_=re.compile("st")))

搜索指定名字的屬性時(shí)可以使用的參數(shù)值包括 字符串 , 正則表達(dá)式 , 列表, True .

下面的例子在文檔樹(shù)中查找所有包含 id 屬性的tag,無(wú)論 id 的值是什么:

soup.find_all(id=True)
# [<a class="sister"  id="link1">Elsie</a>,
#  <a class="sister"  id="link2">Lacie</a>,
#  <a class="sister"  id="link3">Tillie</a>]

使用多個(gè)指定名字的參數(shù)可以同時(shí)過(guò)濾tag的多個(gè)屬性:

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

在這里我們想用 class 過(guò)濾宴胧,不過(guò) class 是 python 的關(guān)鍵詞途茫,這怎么辦削葱?加個(gè)下劃線就可以

print(soup.find_all("a", class_="sister"))

'''
[<a class="sister"  id="link1">Elsie</a>,
<a class="sister"  id="link2">Lacie</a>,
<a class="sister"  id="link3">Tillie</a>
]

'''

通過(guò) find_all() 方法的 attrs 參數(shù)定義一個(gè)字典參數(shù)來(lái)搜索包含特殊屬性的tag:

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

注意:如何查看條件id和class同時(shí)存在時(shí)的寫法

print(soup.find_all('b', class_="story", id="x"))
print(soup.find_all('b', attrs={"class":"story", "id":"x"}))

1.3 text 參數(shù)

通過(guò) text 參數(shù)可以搜搜文檔中的字符串內(nèi)容.與 name 參數(shù)的可選值一樣, text 參數(shù)接受 字符串 , 正則表達(dá)式 , 列表, True

import re

print(soup.find_all(text="Elsie"))
# ['Elsie']

print(soup.find_all(text=["Tillie", "Elsie", "Lacie"]))
# ['Elsie', 'Lacie', 'Tillie']

# 只要包含Dormouse就可以
print(soup.find_all(text=re.compile("Dormouse")))
# ["The Dormouse's story", "The Dormouse's story"]

1.4 limit 參數(shù)

find_all() 方法返回全部的搜索結(jié)構(gòu),如果文檔樹(shù)很大那么搜索會(huì)很慢.如果我們不需要全部結(jié)果,可以使用 limit 參數(shù)限制返回結(jié)果的數(shù)量.效果與SQL中的limit關(guān)鍵字類似,當(dāng)搜索到的結(jié)果數(shù)量達(dá)到 limit 的限制時(shí),就停止搜索返回結(jié)果.

print(soup.find_all("a",limit=2))
print(soup.find_all("a")[0:2])

'''
[<a class="sister"  id="link1">Elsie</a>, 
<a class="sister"  id="link2">Lacie</a>]
'''

2半抱、find()

find( name , attrs , recursive , string , **kwargs )

find_all() 方法將返回文檔中符合條件的所有tag,盡管有時(shí)候我們只想得到一個(gè)結(jié)果.比如文檔中只有一個(gè)<body>標(biāo)簽,那么使用 find_all() 方法來(lái)查找<body>標(biāo)簽就不太合適, 使用 find_all 方法并設(shè)置 limit=1 參數(shù)不如直接使用 find() 方法.下面兩行代碼是等價(jià)的:

soup.find_all('title', limit=1)
# [<title>The Dormouse's story</title>]

soup.find('title')
# <title>The Dormouse's story</title>

唯一的區(qū)別是 find_all() 方法的返回結(jié)果是值包含一個(gè)元素的列表,而 find() 方法直接返回結(jié)果.

find_all() 方法沒(méi)有找到目標(biāo)是返回空列表, find() 方法找不到目標(biāo)時(shí),返回 None .

print(soup.find("nosuchtag"))
# None

soup.head.title 是 tag的名字 方法的簡(jiǎn)寫.這個(gè)簡(jiǎn)寫的原理就是多次調(diào)用當(dāng)前tag的 find() 方法:

soup.head.title
# <title>The Dormouse's story</title>

soup.find("head").find("title")
# <title>The Dormouse's story</title>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末辑甜,一起剝皮案震驚了整個(gè)濱河市率翅,隨后出現(xiàn)的幾起案子材原,更是在濱河造成了極大的恐慌沸久,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件华糖,死亡現(xiàn)場(chǎng)離奇詭異麦向,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)客叉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門诵竭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人兼搏,你說(shuō)我怎么就攤上這事卵慰。” “怎么了佛呻?”我有些...
    開(kāi)封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵裳朋,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我吓著,道長(zhǎng)鲤嫡,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任绑莺,我火速辦了婚禮暖眼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘纺裁。我一直安慰自己诫肠,他們只是感情好司澎,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著栋豫,像睡著了一般挤安。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上丧鸯,一...
    開(kāi)封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天蛤铜,我揣著相機(jī)與錄音,去河邊找鬼骡送。 笑死昂羡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的摔踱。 我是一名探鬼主播虐先,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼派敷!你這毒婦竟也來(lái)了蛹批?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤篮愉,失蹤者是張志新(化名)和其女友劉穎腐芍,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體试躏,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡猪勇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了颠蕴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泣刹。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖犀被,靈堂內(nèi)的尸體忽然破棺而出椅您,到底是詐尸還是另有隱情,我是刑警寧澤寡键,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布掀泳,位于F島的核電站,受9級(jí)特大地震影響西轩,放射性物質(zhì)發(fā)生泄漏员舵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一藕畔、第九天 我趴在偏房一處隱蔽的房頂上張望固灵。 院中可真熱鬧,春花似錦劫流、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)仍秤。三九已至,卻和暖如春可很,著一層夾襖步出監(jiān)牢的瞬間诗力,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工我抠, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留苇本,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓菜拓,卻偏偏與公主長(zhǎng)得像瓣窄,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子纳鼎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

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