python-69:find() 和 find_all()

find 和 find_all()的詳細說明和使用方法在BS4文檔的"搜索文檔樹" 這一章節裏面,這一章節的內容對爬蟲來講很重要,並且也不是不少,建議你們仍是認真的學習這一小部分的內容,我這裏就簡單的講解一下,首先,第一個問題html

1. find 和 find_all 能用來作什麼?
python

find 和 find_all 是BeautifulSoup 定義的兩種文檔樹的搜索方法。正則表達式

這個"文檔樹"是什麼?文檔樹就是BS實例的內容,若是BS的實例是一個網頁的源碼,那麼這個源碼就是文檔樹,若是是一段文字或者一句話甚至是一串字符串,那它們也是一個文檔樹。因此,更通俗的理解就是,find 和 find_all()夠幫助咱們在文檔樹中尋找咱們想要的內容。函數

2. find 和 find_all 的區別學習

find 和 find_all 兩個函數的參數同樣,使用方法也差很少,因此這裏先說明一下它們的區別,其實也很簡單:code

  1. find 返回的是匹配的第一個結果,find_all 返回匹配的全部結果
    htm

  2. find 直接將結果返回,find_all 將結果做爲一個列表返回文檔

3. find 和 find_all 怎麼使用字符串

兩個函數的函數原型以下:原型

find_all( name , attrs , recursive , text , **kwargs )
find( name , attrs , recursive , text , **kwargs )

這兩個函數的基本參數是同樣的,用法也大體相同,那麼,咱們就來看看這些參數都有什麼含義吧

1. name:name 參數能夠查找全部名字爲 name 的tag

這裏要明確兩個問題:

    1. "查找全部名字爲 name 的tag" 說明name參數只能對tag進行操做

    2. name的值能夠是什麼?

name的值能夠有不少,標籤,字符串,RE,甚至是函數方法等等,咱們來詳細的看一下

  1 最簡單用法是僅僅給定一個tag name值。下面的代碼尋找文檔中全部的 <B>  

soup.find_all('b')

  2 傳一個正則表達式。下面的代碼尋找全部以b開頭的標籤:      

soup.find_all(re.compile('^b'))

   3 傳一個list或dictionary。下面兩個調用是查找全部的<TITLE>和<P>標籤。 他們得到結果同樣,可是後一種方法更快一些:   

soup.find_all(['title', 'p'])
soup.find_all({'title' : True, 'p' : True})

  4 傳一個True值,這樣能夠匹配每一個tag的name:也就是匹配每一個tag。

soup.find_all(True)

  5 先定義一個函數或者方法,並將它傳入

def has_class_but_no_id(tag):
    return tag.has_attr('class') and not tag.has_attr('id')
將這個方法做爲參數傳入 find_all() 方法,將獲得全部<p>標籤:
soup.find_all(has_class_but_no_id)

 2. keyword:keyword參數上面並無,可是這倒是一個很重要的參數,它可以幫咱們篩選tag的屬性,下面這個例子是查找擁有屬性align且值爲center的 全部標籤:

soup.find_all(align="center")

它跟name參數同樣,也能夠傳入不一樣的值

3. attrs:attrs是一個字典,用起來就和keyword參數同樣,你可使用attrs去匹配那些名字爲Python保留字的屬性, 例如class, for, 以及import; 或者那些跟Beautiful Soup函數名或者參數名相同的名字, 例如name, recursive, limit, text, 以及attrs自己

soup.find_all(attrs={'id' : re.compile("para$")})

4. text:text 參數用於搜索文檔中的字符串內容.與 name 參數的可選值同樣, text 參數接受 字符串 , 正則表達式 , 列表, True,下面的例子是搜索文檔中含有"one" 的字符串

soup.find_all(text="one")

5. recursive:recursive 是一個布爾參數(默認爲True),用於指定Beautiful Soup是否檢索當前tag的全部子孫節點,下面的例子爲不遍歷當前tag的全部子孫節點

soup.html.find_all("title", recursive=False)

好了,這就是find和find_all的基本介紹,咱們下一小節來看看怎麼使用find和find_all實現咱們的功能

相關文章
相關標籤/搜索