搜索文檔樹(shù)
上一篇:
find() 和 find_all()是搜索文檔時(shí),主要使用的方法。
1、find_all():
find_all( name , attrs , recursive , text , **kwargs )
find_all()是通過(guò)過(guò)濾器進(jìn)行文檔查找的。支持的參數(shù)包括:
- 字符串
- 正則表達(dá)式
- 列表
- True
- 自定義方法

image.png
find_all的使用示例:
查找目標(biāo):查找個(gè)人首頁(yè)中,我的文集
# 獲取<ul class="list">下的所以子標(biāo)簽
essays = bsobj.find_all('ul', attrs={'class': 'list'})
print(len(essays))
- 采用上面的代碼,輸出結(jié)果是2,則存在2個(gè)標(biāo)簽滿足條件,還需要進(jìn)行進(jìn)一步的過(guò)濾,才能獲取到結(jié)果信息。
- 由于要獲取的文集信息為ul標(biāo)簽的子標(biāo)簽,可以嘗試獲取ul標(biāo)簽的所有子標(biāo)簽,由于文集具有跳轉(zhuǎn)鏈接,簡(jiǎn)書(shū)文集的跳轉(zhuǎn)鏈接中,包含
nb,可以采用正則表達(dá)式去匹配帶有文集信息的標(biāo)簽:
import re
essays = bsobj.find_all('a', attrs={'class': 'name'}, href=re.compile("^/nb/"))
print(essays)
結(jié)果:返回了我的文集中的所有標(biāo)簽信息。
[<a class="name" href="/nb/23293583" target="_blank">
python接口測(cè)試_base
<!-- -->
</a>, <a class="name" href="/nb/21337746" target="_blank">
工具_(dá)Loadrunner的使用
<!-- -->
</a>, <a class="name" href="/nb/15263522" target="_blank">
性能測(cè)試_基礎(chǔ)
<!-- -->
</a>, <a class="name" href="/nb/15008171" target="_blank">
Jmeter-初識(shí)
<!-- -->
</a>]
- 思考問(wèn)題:想要獲取href屬性的值和text信息,并存儲(chǔ)為json格式信息或者字典,應(yīng)該怎么操作呢?
import re
essays = bsobj.find_all('a', attrs={'class': 'name'}, href=re.compile("^/nb/"))
essay_dict = {}
for essay in essays:
essay_link = essay['href']
essay_name = essay.text
essay_dict[essay_name.strip()] = essay_link
print(essay_dict)
print(type(essay_dict))
import json
essay_json = json.dumps(essay_dict)
print(type(essay_json))
結(jié)果:
{'python接口測(cè)試_base': '/nb/23293583', '工具_(dá)Loadrunner的使用': '/nb/21337746', '性能測(cè)試_基礎(chǔ)': '/nb/15263522', 'Jmeter-初識(shí)': '/nb/15008171'}
<class 'dict'>
<class 'str'>
2、find
find( name , attrs , recursive , text , **kwargs )
def find(self, name=None, attrs={}, recursive=True, text=None, **kwargs):
- find_all() 方法將返回文檔中符合條件的所有tag,當(dāng)文檔中只有一個(gè)<body>標(biāo)簽,那么使用 find_all() 方法來(lái)查找<body>標(biāo)簽就不太合適, 使用 find_all 方法并設(shè)置 limit=1 參數(shù)不如直接使用 find() 方法。
- 唯一的區(qū)別是 find_all() 方法的返回結(jié)果是值包含一個(gè)元素的列表,而 find() 方法直接返回結(jié)果
- find_all() 方法沒(méi)有找到目標(biāo)是返回空列表, find() 方法找不到目標(biāo)時(shí),返回 None
3、find_parents() 和 find_parent()
4、find_next_siblings() 和find_next_sibling()
5、find_previous_siblings() 和 find_previous_sibling()
6、find_all_next() 和 find_next()
7、find_all_previous() 和 find_previous()
3、4、5、6、7中的方法,支持的參數(shù)與find_all()和find()相同,方法的功能與遍歷文檔樹(shù)中介紹的相對(duì)應(yīng)。理解了前面的內(nèi)容,對(duì)這幾個(gè)方法就很好理解了。
8、CSS選擇器
def select(self, selector, _candidate_generator=None, limit=None):
Beautiful Soup支持大部分的CSS選擇器,在Tag或BeautifulSoup中傳入select()方法中傳入字符串參數(shù),即可使用CSS選擇器的語(yǔ)法找到tag.
- 要運(yùn)用CSS選擇器,首先要掌握CSS選擇器的語(yǔ)法
- 參考菜鳥(niǎo)教程:http://www.runoob.com/cssref/css-selectors.html
支持的查找方式
- 通過(guò)Tag標(biāo)簽逐層查找
- 找到某個(gè)tag標(biāo)簽下的直接子標(biāo)簽
- 找到兄弟節(jié)點(diǎn)標(biāo)簽
- 通過(guò)CSS的類名查找
- 通過(guò)tag的id查找
- 通過(guò)是否存在某個(gè)屬性來(lái)查找
- 通過(guò)屬性的值來(lái)查找
- 通過(guò)語(yǔ)言設(shè)置來(lái)查找
示例
根據(jù)選擇器語(yǔ)法進(jìn)行練習(xí)獲取標(biāo)簽信息就可以啦:
- 查找文集的標(biāo)簽信息(以下的方式都可以):
title = bsobj.select('[href] ~ .name')
title = bsobj.select('a[class=name]')
title = bsobj.select('div > ul > li > a[class=name]')
print(title)
[<a class="name" href="/nb/23293583" target="_blank">
python接口測(cè)試_base
<!-- -->
</a>, <a class="name" href="/nb/21337746" target="_blank">
工具_(dá)Loadrunner的使用
<!-- -->
</a>, <a class="name" href="/nb/15263522" target="_blank">
性能測(cè)試_基礎(chǔ)
<!-- -->
</a>, <a class="name" href="/nb/15008171" target="_blank">
Jmeter-初識(shí)
<!-- -->
</a>]
總結(jié)
- 搜索文檔樹(shù)在BeautifulSoup中是最常用的功能
- 尤其需要掌握f(shuō)ind_all()和find()方法的使用,靈活運(yùn)用各類過(guò)濾器獲取標(biāo)簽信息
- 如果對(duì)于CSS選擇器的語(yǔ)法熟練,采用CSS選擇器搜索文檔也是非常好用的喲