python之BeautifulSoup4模組
目錄
概述
BeautifulSoup是一種專門用於進行HTML/XML資料解析的一種描述語言,可以很好的分析和篩選HTML/XML這樣的標記文件中的指定規則資料。在資料篩選過程中其基礎技術是通過封裝HTML DOM樹實現的一種DOM操作,通過載入網頁文件物件的形式,從文件物件樹模型中獲取目標資料。 BeautifulSoup操作簡單易於上手,在很多對於資料篩選效能要求並不是特別苛刻的專案中經常使用,目前市場流行的操作版本是BeautifulSoup4,經常稱BS4。
Xpath和BeautifulSoup都是基於DOM的一種操作模式。不同點在於載入文件物件模型DOM時出現的文件節點遍歷查詢操作過程,Xpath在進行遍歷操作時針對描述語言指定的語法結構進行區域性DOM物件樹的遍歷得到具體的資料,但是BS4在操作過程中,會將整個文件樹進行載入然後進行查詢匹配操作,使用過程中消耗資源較多,處理效能相對Xpath較低,但優勢在於足夠簡單。
安裝模組
pip install beautifulsoup4
常見用法
獲得物件
一般BS4將HTML文件物件會轉換成如下四種類型組合的文件樹: * Tag:標籤物件 * NavigableString:字元內容操作物件 * BeautifulSoup:文件物件 * Comment:特殊型別的NavigableString
from bs4 import BeautifulSoup soup = BeautifulSoup("<html><body><p>data</p></body></html>") # 獲得文件物件(beautifulsoup) # 返回<html><body><p>data</p></body></html> # 以列表形式返回soup或標籤的子節點 soup.contents soup('p') # 返回文件物件中所有p標籤的列表[<p>data</p>] soup.p # 獲得標籤物件(tag) # 返回文件物件中第一個p標籤<p>data</p> # 按標準格式輸出文件物件 print(soup.prettify()) # 獲得文件物件的所有內容 print(soup.get_text()) # 獲取tag物件的name屬性 print(soup.p.name) # 獲得字元內容操作物件(NavigableString)
搜尋方法
name:需要搜尋的子標籤名稱,搜尋標籤名稱時可以使用的引數值包括字串、正則表示式、列表和True
attrs:即keyword引數,如果一個指定名字的引數不是搜尋內建的引數名,搜尋時會把該引數當作指定名字tag的屬性來搜尋。搜尋指定名字的屬性時可以使用的引數值包括字串、正則表示式、列表和True
recursive:預設檢索當前tag的所有子孫節點,如果只想搜尋tag的直接子節點,可以使用引數 recursive=False
string:需要搜尋的子標籤包含的字串,可以使用的引數值包括字串、正則表示式、列表和True
**kwargs:需要傳入的其它引數,如limit=1傳入可以限定搜尋結果的數量,達到數量後停止搜尋
find_all()
方法搜尋當前tag的所有tag子節點,並判斷是否符合過濾器的條件,返回所有元素的列表。
soup.find_all("title") # 返回所有title標籤列表
soup.find_all("p", "title") # 返回所有某個屬性值為title的p標籤列表
soup.find_all(id="link2") # 返回所有id屬性值為link2的標籤列表
soup.find(string=re.compile("sisters")) # 返回第一個匹配siters字串的標籤內容
soup.find_all(string=["Tillie", "Elsie", "Lacie"]) # 返回所有匹配列表元素的標籤內容
soup.find_all(href=re.compile("elsie")) # 返回所有href屬性匹配elsie值的標籤列表
soup.find_all(id=True) # 返回所有包含id屬性的標籤列表
soup.find_all(href=re.compile("elsie"), id='link1') #同時過濾多個條件並返回匹配的標籤列表
soup.find_all(string=re.compile("Dormouse")) # 返回所有模糊匹配Dormouse的標籤內容
def is_the_only_string_within_a_tag(s):
""Return True if this string is the only child of its parent tag.""
return (s == s.parent.string)
soup.find_all(string=is_the_only_string_within_a_tag) # 引數傳入方法並返回所有匹配的標籤列表
但是,有些tag屬性在搜尋不能使用,比如HTML5中的 data-* 屬性:
data_soup = BeautifulSoup('<div data-foo="value">foo!</div>')
data_soup.find_all(data-foo="value")
# SyntaxError: keyword can't be an expression
但是可以通過 find_all()
方法的 attrs
引數定義一個字典引數來搜尋包含特殊屬性的tag:
data_soup.find_all(attrs={"data-foo": "value"})
# [<div data-foo="value">foo!</div>]
按照CSS類名搜尋tag的功能非常實用,但標識CSS類名的關鍵字 class
在Python中是保留字,使用 class
做引數會導致語法錯誤.從Beautiful Soup的4.1.1版本開始,可以通過 class_
引數搜尋有指定CSS類名的tag:
soup.find_all("a", class_="sister")
# class_ 引數同樣接受不同型別的 過濾器 ,字串,正則表示式,方法或 True
soup.find_all(class_=re.compile("itl"))
def has_six_characters(css_class):
return css_class is not None and len(css_class) == 6
soup.find_all(class_=has_six_characters)
find_all()
方法搜尋當前tag的第一個tag子節點,並判斷是否符合過濾器的條件,並返回該元素。