Python知識(shí)分享網(wǎng) - 專業(yè)的Python學(xué)習(xí)網(wǎng)站 學(xué)Python,上Python222
Python BeautifulSoup之find_all方法使用詳解
匿名網(wǎng)友發(fā)布于:2023-07-08 12:12:06
(侵權(quán)舉報(bào))

name:標(biāo)簽名搜索
attrs/class_:屬性/類名搜索
recursive:限定直接子節(jié)點(diǎn)
string:文檔字符串搜索

 

1. 標(biāo)簽名搜索——name

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

 

#簡單的用法如下
soup.find_all("title")

#支持多標(biāo)簽搜索
soup.find_all(name=['div','p'])

 

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

 

2. 基于標(biāo)簽的屬性查找——attrs/class_/id/title/…
通過標(biāo)簽屬性查找的方式適用大多數(shù)標(biāo)簽屬性,包括id,style,title,但有 “-”,Class標(biāo)簽屬性例外。詳解如下:

2.1 通用方式屬性搜索——attrs
比如html5標(biāo)簽中的data-custom屬性,如果我們這樣
 

soup.find(data-custom="custom")#錯(cuò)誤寫法

 

那么則會(huì)報(bào)錯(cuò)。原因是在python中變量不能含有"-"這個(gè)字符,而我們傳遞的data-custom有這個(gè)字符。

解決辦法是在attrs屬性用字典進(jìn)行傳遞參數(shù)

 

soup.find(attrs={'data-custom':'custom'})

 

2.2 CSS類名搜索——class_

通過 class_ 參數(shù)搜索有指定CSS類名的tag(可簡寫):

 

soup.find_all("a", "sister") #class_="sister"
#‘class’在python中是保留字,所以使用時(shí)需加‘下劃線_’

 

tag的 class 屬性是 多值屬性 .按照CSS類名搜索tag時(shí),可以分別搜索tag中的每個(gè)CSS類名:

 

css_soup = BeautifulSoup('<p class="body strikeout"></p>')
css_soup.find_all("p", class_="strikeout")
# [<p class="body strikeout"></p>]

css_soup.find_all("p", class_="body")
# [<p class="body strikeout"></p>]

 

搜索 class 屬性時(shí)也可以通過CSS值完全匹配:

 

css_soup.find_all("p", class_="body strikeout")
# [<p class="body strikeout"></p>]

 

3. 文檔字符串內(nèi)容搜索——string

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

 

soup.find_all(string=["Tillie", "Elsie", "Lacie"])
# [u'Elsie', u'Lacie', u'Tillie']

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

 

string 還可以與其它參數(shù)混合使用來過濾tag.
下面代碼用來搜索內(nèi)容里面包含“Elsie”的標(biāo)簽:

 

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

 

4. 限定直接子節(jié)點(diǎn)——recursive
調(diào)用tag的 find_all() 方法時(shí),Beautiful Soup會(huì)檢索當(dāng)前tag的所有子孫節(jié)點(diǎn),如果只想搜索tag的直接子節(jié)點(diǎn),可以使用參數(shù) recursive=False .

附:簡寫小技巧
BeautifulSoup 對象和 tag 對象可以被當(dāng)作一個(gè)方法來使用,這個(gè)方法的執(zhí)行結(jié)果與調(diào)用這個(gè)對象的 find_all() 方法相同,下面兩行代碼是等價(jià)的:
 

soup.find_all("a")
soup("a")

 

參考文獻(xiàn)

[1] delong(翻譯).Beautiful Soup 4.4.0 文檔[EB/OL].BeautifulSoup官方文檔. https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/#id27

 

轉(zhuǎn)載自:https://blog.csdn.net/weixin_45671758/article/details/111595048