name:標(biāo)簽名搜索
attrs/class_:屬性/類名搜索
recursive:限定直接子節(jié)點(diǎn)
string:文檔字符串搜索
1. 標(biāo)簽名搜索——name
name 參數(shù)可以查找所有標(biāo)簽名為 name 的tag,字符串對(duì)象會(huì)被自動(dòng)忽略掉.
#簡(jiǎn)單的用法如下
soup.find_all("title")
#支持多標(biāo)簽搜索
soup.find_all(name=['div','p'])
重申: 搜索 name 參數(shù)的值可以使任一類型的 過(guò)濾器 ,字符竄,正則表達(dá)式,列表,方法或是 True .
2. 基于標(biāo)簽的屬性查找——attrs/class_/id/title/…
通過(guò)標(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ò)誤寫(xiě)法
那么則會(huì)報(bào)錯(cuò)。原因是在python中變量不能含有"-"這個(gè)字符,而我們傳遞的data-custom有這個(gè)字符。
解決辦法是在attrs屬性用字典進(jìn)行傳遞參數(shù):
soup.find(attrs={'data-custom':'custom'})
2.2 CSS類名搜索——class_
通過(guò) class_ 參數(shù)搜索有指定CSS類名的tag(可簡(jiǎn)寫(xiě)):
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í)也可以通過(guò)CSS值完全匹配:
css_soup.find_all("p", class_="body strikeout")
# [<p class="body strikeout"></p>]
3. 文檔字符串內(nèi)容搜索——string
通過(guò) 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ù)混合使用來(lái)過(guò)濾tag.
下面代碼用來(lái)搜索內(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 .
附:簡(jiǎn)寫(xiě)小技巧
BeautifulSoup 對(duì)象和 tag 對(duì)象可以被當(dāng)作一個(gè)方法來(lái)使用,這個(gè)方法的執(zhí)行結(jié)果與調(diào)用這個(gè)對(duì)象的 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