天天看點

python soup findall_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即可。