Python網絡編程之BeautifulSoup庫的使用(三)


接上篇:


6. 搜索文檔數


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


Find_all()方法搜索當前tag的所有tag子節點,並判斷是否符合過濾器條件。


1) name參數


name參數可以搜索所有名字為name的tag,字符串對象將被自動忽略。


A. 傳字符串


最簡單的過濾器是字符串.在搜索方法中傳入一個字符串參數,Beautiful Soup會查找與字符串完整匹配的內容,下面的例子用於查找文檔中所有的標籤:

Python網絡編程之BeautifulSoup庫的使用(三)

輸出:

Python網絡編程之BeautifulSoup庫的使用(三)


B. 傳正則表達式


如果傳入正則表達式作為參數,Beautiful Soup會通過正則表達式的 match() 來匹配內容.下面例子中找出所有以b開頭的標籤,這表示

標籤都應該被找到:Python網絡編程之BeautifulSoup庫的使用(三)

輸出:

Python網絡編程之BeautifulSoup庫的使用(三)


C. 傳列表


如果傳入列表參數,Beautiful Soup會將與列表中任一元素匹配的內容返回.下面代碼找到文檔中所有標籤和標籤:

Python網絡編程之BeautifulSoup庫的使用(三)

輸出:

Python網絡編程之BeautifulSoup庫的使用(三)


D. 傳True


True 可以匹配任何值,下面代碼查找到所有的tag,但是不會返回字符串節點:

Python網絡編程之BeautifulSoup庫的使用(三)

輸出:

Python網絡編程之BeautifulSoup庫的使用(三)


E. 傳方法


如果沒有合適過濾器,那麼還可以定義一個方法,方法只接受一個元素參數 ,如果這個方法返回 True 表示當前元素匹配並且被找到,如果不是則反回 False。


下面方法校驗了當前元素,如果包含 class 屬性卻不包含 id 屬性,那麼將返回 True:

Python網絡編程之BeautifulSoup庫的使用(三)

將這個方法作為參數傳入 find_all() 方法,將得到所有

標籤:

Python網絡編程之BeautifulSoup庫的使用(三)

輸出:

Python網絡編程之BeautifulSoup庫的使用(三)


2) keyword參數


如果一個指定名字的參數不是搜索內置的參數名,搜索時會把該參數當作指定名字tag的屬性來搜索,如果包含一個名字為 id 的參數,Beautiful Soup會搜索每個tag的"id"屬性,用例:

Python網絡編程之BeautifulSoup庫的使用(三)

輸出:

Python網絡編程之BeautifulSoup庫的使用(三)


使用多個指定名字的參數可以同時過濾tag的多個屬性,用例:

Python網絡編程之BeautifulSoup庫的使用(三)

輸出:

Python網絡編程之BeautifulSoup庫的使用(三)


在這裡我們想用 class 過濾,不過 class 是 python 的關鍵詞,這怎麼辦?加個下劃線就可以,用例:

Python網絡編程之BeautifulSoup庫的使用(三)

輸出:

Python網絡編程之BeautifulSoup庫的使用(三)


3) text參數


通過 text 參數可以搜搜文檔中的字符串內容.與 name 參數的可選值一樣, text 參數接受 字符串 , 正則表達式 , 列表, True, 用例:

Python網絡編程之BeautifulSoup庫的使用(三)

輸出:

Python網絡編程之BeautifulSoup庫的使用(三)


4) limit參數


find_all() 方法返回全部的搜索結構,如果文檔樹很大那麼搜索會很慢.如果我們不需要全部結果,可以使用 limit 參數限制返回結果的數量.效果與SQL中的limit關鍵字類似,當搜索到的結果數量達到 limit 的限制時,就停止搜索返回結果.


文檔樹中有3個tag符合搜索條件,但結果只返回了2個,因為我們限制了返回數量,用例:

Python網絡編程之BeautifulSoup庫的使用(三)

輸出:

Python網絡編程之BeautifulSoup庫的使用(三)


5) Recursive參數


調用tag的 find_all() 方法時,Beautiful Soup會檢索當前tag的所有子孫節點,如果只想搜索tag的直接子節點,可以使用參數 recursive=False .

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


它與 find_all() 方法唯一的區別是 find_all() 方法的返回結果是值包含一個元素的列表,而 find() 方法直接返回結果

(3)find_parents() find_parent()

find_all() 和 find() 只搜索當前節點的所有子節點,孫子節等.。find_parents() 和 find_parent() 用來搜索當前節點的父輩節點,搜索方法與普通tag的搜索方法相同,搜索文檔搜索文檔包含的內容。

(4)find_next_siblings() find_next_sibling()


這2個方法通過 .next_siblings 屬性對當 tag 的所有後面解析的兄弟 tag 節點進行迭代,,find_next_siblings() 方法返回所有符合條件的後面的兄弟節點,find_next_sibling() 只返回符合條件的後面的第一個tag節點

(5)find_previous_siblings() find_previous_sibling()


這2個方法通過 .previous_siblings 屬性對當前 tag 的前面解析的兄弟 tag 節點進行迭代,,find_previous_siblings() 方法返回所有符合條件的前面的兄弟點,,find_previous_sibling() 方法返回第一個符合條件的前面的兄弟節點。

(6)find_all_next() find_next()


這2個方法通過 .next_elements 屬性對當前 tag 的之後的 tag 和字符串進行迭代,,find_all_next() 方法返回所有符合條件的節點, find_next() 方法返回第一個符合條件的節點。

(7)find_all_previous() 和 find_previous()


這2個方法通過 .previous_elements 屬性對當前節點前面的 tag 和字符串進行迭代,,find_all_previous() 方法返回所有符合條件的節點, find_previous()方法返回第一個符合條件的節點。


分享到:


相關文章: