安裝:Installing Beautiful Soup4?
功能:BeautifulSoup用于從HTML和XML文件中提取數(shù)據(jù)
常用場景:網(wǎng)頁爬取數(shù)據(jù)或文本資源后,對其進(jìn)行解析,獲取所需信息
以下詳細(xì)的介紹了beautifulsoup的基礎(chǔ)用法
BeautifulSoup 將html文檔轉(zhuǎn)換成樹形結(jié)構(gòu)對象,包含:
① tag(原h(huán)tml標(biāo)簽,有name和attribute屬性)?
② NavigableString(包裝tag中的字符串,通過string獲得字符串)
③ BeautifulSoup(表示一個文檔的全部內(nèi)容)
yourhtml = 'Extremely bold'
soup = BeautifulSoup(yourhtml, parse_method)
# 獲取tag名稱
soup.tag.name
# 還可改變soup對象的tag名稱b
tag.name = "blockquote" # 變?yōu)?blockquote class="boldest">Extremely bold
# 獲取tag的屬性
soup.tag.attrs # {u'class': u'boldest'}
# 取得標(biāo)簽下的屬性class對應(yīng)的值(類似字典取值)
soup.tag["class"] # u'boldest'
# 如果yourhtml有多值屬性,比如'',class對應(yīng)的屬性為["body", "strikeout"]列表
# 獲取NavigableString類包裝的字符串
soup.tag.string # u'Extremely bold'
# NavigableString類包裝的子符串不能編輯但可替換,tag.string.replace_with("No longer bold")
1.2 解析方法parse_method
?BeautifulSoup 為不同的解析器提供了相同的接口,但是如果不是標(biāo)準(zhǔn)格式的文檔結(jié)構(gòu),不同的解析器可能解析出不同結(jié)構(gòu)的樹型文檔(特別是XML解析器和HTML解析器),如果是標(biāo)準(zhǔn)格式文檔,則不同解析器只是解析速度不同,解析結(jié)果是一致的。
# 直接獲取tag_name標(biāo)簽
soup.tag_name # 如soup.head, soup.title, soup.body.b
# 將tag_name的直接子字節(jié)以列表方式返回
soup.tag_name.contents # 字符沒有子節(jié)點所以沒有contents屬性
# 返回標(biāo)簽直接子節(jié)點的生成器,通過遍歷獲取每一個子節(jié)點內(nèi)容
soup.tag_name.children
# 返回tag_name下所有子孫節(jié)點內(nèi)容的生成器
soup.tag_name.descendants
soup.tag_name.string # 僅當(dāng)tag_name下只有一個字符串字節(jié)時,可返回子字節(jié),但若有多個子字節(jié),.string方法無法確定應(yīng)調(diào)用哪個子節(jié)點內(nèi)容,所以會返回None。所以應(yīng)通過.strings 來循環(huán)獲取,.stripped_strings 同時可以去除多余的空白內(nèi)容
for string in soup.stripped_strings:
print(repr(string))
"""
u'Once upon a time there were three little sisters; and their names were'
u'Elsie'
u','
u'Lacie'
"""
第3、4點暫時不做詳細(xì)的討論
5.1 find
查找符合條件的第一個內(nèi)容
5.1.1 參數(shù):
find( name # 查找標(biāo)簽
? ? ?,attrs # 查找標(biāo)簽屬性
? ? ?,recursive # 循環(huán)
? ? ?,text # 查找文本) ? ?找目標(biāo)首次出現(xiàn)的結(jié)果,返回一個beautfulsoup的標(biāo)簽對象
from bs4 import BeautifulSoup
with open('ecologicalpyramid.html', 'r') as ecological_pyramid:
soup = BeautifulSoup(ecological_pyramid, 'html')
producer_string = soup.find(text = 'plants') # 通過文本查找:plants
producer_entries = soup.find('ul') # 標(biāo)簽查找
soup.find(id="link3") # 通過id查找
5.1.2 通過class屬性查找
class屬性規(guī)定了元素的類名,但是查找時沒辦法將class當(dāng)做變量名,有以下查詢方法。以下find替換為find_all同樣可行
soup.find("span",{"class":{"green","red"}})
或
soup.find(name="span", attrs={"green" :"red"}
或
soup.find(class_="green") # 注意class_有下劃線
或
soup.find("", {"class":"green"})
5.2 正則表達(dá)式
在沒有標(biāo)簽或者文本的情況下可使用正則查詢,比如查找郵箱
import re
from bs4 import BeautifulSoup
email_id_example = """
The below HTML has the information that has email ids.
abc@example.com
xyz@example.com
foo@example.com
"""
soup = BeautifulSoup(email_id_example)
emailid_regexp = re.compile("\w+@\w+\.\w+") # \w+ 匹配字母或數(shù)字或下劃線或漢字一次或多次
first_email_id = soup.find(text=emailid_regexp) # 用正則表達(dá)式匹配文本
print(first_email_id)
輸出結(jié)果:abc@example.com
5.3 find_all
soup.find_all()查找符合條件的所有內(nèi)容
5.3.1 參數(shù):
find_all(name, attrs, recursive, text, limit)
limit參數(shù)可以限制得到的結(jié)果的數(shù)目(當(dāng)limit=1即和find()一樣的結(jié)果)
recursive=False表示只返回最近的子節(jié)點
text可傳遞指定尋找的字符串(可以是列表)
5.3.2 正則結(jié)合find_all()使用
目的:查找所有a標(biāo)簽,且字符串內(nèi)容包含關(guān)鍵字“Elsie”
for x in soup.find_all('a',href = re.compile('lacie')):
print(x)
Lacie
5.3.3 get
一般href屬性對應(yīng)的值為鏈接
目的:1.獲取所有鏈接,保存在列表中;2.查詢所有a標(biāo)簽,輸出所有標(biāo)簽中的“字符串”內(nèi)容;3.查找所有含"id"屬性的tag
linklist = []
for x in soup.find_all('a'):
link = x.get('href') # 獲取屬性值的技巧
if link:
linklist.append(link)
"""
linklist:
http://example.com/elsie
http://example.com/lacie
http://example.com/tillie
"""
string = x.get_text() # 獲取所有標(biāo)簽中所有的“字符串”內(nèi)容
soup.find_all(id=True) # 查找所有含"id"屬性的tag,無論id值是什么
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。