1. 程式人生 > >BeautifulSoup find() 和 find_all()

BeautifulSoup find() 和 find_all()

BeautifulSoup 裡的 find() 和 find_all() 可能是你最常用的兩個函式。藉助它們,你可以通過標籤的不同屬性輕鬆地過濾 HTML 頁面,查詢需要的標籤組或單個標籤。

這兩個函式非常相似,BeautifulSoup 文件裡兩者的定義就是這樣:

find_all(tag, attributes, recursive, text, limit, keywords)
find(tag, attributes, recursive, text, keywords)

很可能你會發現,自己在 95% 的時間裡都只需要使用前兩個引數: tag 和 attributes 。但是,我們還是應該仔細地觀察所有的引數。

  • tag
    標籤引數 tag 前面已經介紹過——你可以傳一個標籤的名稱或多個標籤名稱組成的 Python列表做標籤引數。例如,下面的程式碼將返回一個包含 HTML 文件中所有標題標籤的列表:
    .find_all({"h1","h2","h3","h4","h5","h6"})
  • attributes
    屬性引數 attributes 是用一個 Python 字典封裝一個標籤的若干屬性和對應的屬性值。例如,下面這個函式會返回 HTML 文件裡紅色與綠色兩種顏色的 span 標籤:
    .find_all("span", {"class":{"green", "red"}})
  • recursive
    遞迴引數 recursive 是一個布林變數。你想抓取 HTML 文件標籤結構裡多少層的資訊?如果recursive 設定為 True , find_all 就會根據你的要求去查詢標籤引數的所有子標籤,以及子標籤的子標籤。如果 recursive 設定為 False , find_all 就只查詢文件的一級標籤。 find_all預設是支援遞迴查詢的( recursive 預設值是 True );一般情況下這個引數不需要設定,除非你真正瞭解自己需要哪些資訊,而且抓取速度非常重要,那時你可以設定遞迴引數。
  • text
    文字引數 text 有點不同,它是用標籤的文字內容去匹配,而不是用標籤的屬性。假如我們想查詢前面網頁中包含“the prince”內容的標籤數量,我們可以把之前的 find_all方法換成下面的程式碼:
nameList = bsObj.find_all(text="the prince")
print(len(nameList))

輸出結果為“7”。

  • limit
    範圍限制引數 limit ,顯然只用於 find_all 方法。 find 其實等價於 find_all 的 limit 等於1 時的情形。如果你只對網頁中獲取的前 x 項結果感興趣,就可以設定它。但是要注意,這個引數設定之後,獲得的前幾項結果是按照網頁上的順序排序的,未必是你想要的那前幾項。
  • keyword
    還有一個關鍵詞引數 keyword ,可以讓你選擇那些具有指定屬性的標籤。例如:
allText = bsObj.find_all(id="text")
print(allText[0].get_text())