BeautifulSoup庫findAll()、find()方法詳解

find()和findAll()官方定義如下:

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

95%的時間只用前2個參數:tag,attributes。

tag
可以傳一個標籤的名稱或多個標籤名稱組成的 Python列表做標籤參數。例如,下面的代碼將返回一個包含 HTML 文檔中所有標題標籤的列表:
.findAll({"h1","h2","h3","h4","h5","h6"})

attributes
屬性參數 attributes 是用一個 Python 字典封裝一個標籤的若干屬性和對應的屬性值。例如,下面這個函數會返回 HTML 文檔裏紅色與綠色兩種顏色的 span 標籤:
.findAll("span", {"class":{"green", "red"}})
如果只返回一種顏色的,如綠色:
.findAll("span", {"class": "green"})

recursive
遞歸參數 recursive 是一個布爾變量。你想抓取 HTML 文檔標籤結構裏多少層的信息?如果recursive 設置爲 True , findAll 就會根據你的要求去查找標籤參數的所有子標籤,以及子標籤的子標籤。如果 recursive 設置爲 False , findAll 就只查找文檔的一級標籤。 findAll默認是支持遞歸查找的( recursive 默認值是 True );一般情況下這個參數不需要設置。

text
文本參數 text 有點不同,它是用標籤的文本內容去匹配,而不是用標籤的屬性。假如我們想查找前面網頁中包含“the prince”內容的標籤數量,我們可以把之前的 findAll 方法換成下面的代碼:

nameList = bsObj.findAll(text="the prince")
print(len(nameList))

limit
範圍限制參數 limit ,顯然只用於 findAll 方法。 find 其實等價於 findAll 的 limit 等於1 時的情形。如果你只對網頁中獲取的前 x 項結果感興趣,就可以設置它。

keywords
可以讓你選擇那些具有指定屬性的標籤,屬於冗餘的技術,如下所示:第一行採用keywords,第二行採用前兩個參數:tag、attributes

bsObj.findAll(id="text")
bsObj.findAll("", {"id":"text"})

用 keyword 偶爾會出現問題,尤其是在用 class 屬性查找標籤的時候,因爲 class 是 Python 中受保護的關鍵字。所以一般只採用前2個參數tag、attributes即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章