03_BeautifulSoup的使用2-搜索文檔樹(shù)

搜索文檔樹(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選擇器,在TagBeautifulSoup中傳入select()方法中傳入字符串參數(shù),即可使用CSS選擇器的語(yǔ)法找到tag.

支持的查找方式
  • 通過(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選擇器搜索文檔也是非常好用的喲
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容