瞭解bs4
bs4(Beautiful Soup)是一個可以從HTML或XML文件中提取數據的Python庫
它能夠通過你喜歡的轉換器實現慣用的文檔導航,查找,修改文檔的方式
Beautiful Soup會幫你節省數小時甚至數天的工作時間
BeautifulSoup
BeautifulSoup是bs4中非常重要的一個類
它利用html或xml文件快速生一個對象
我們可以借用該對象的方法和屬性快速獲取我們需要的數據
用法: BeatifulSoup(html, resolver)
解析器的選擇,根據不同的需求選擇響應的解析器
bs4中對象的種類
首先來看一段測試代碼:
import bs4
import requests
# html測試代碼
#只包含一個div標籤
#div中包含一個p標籤,一段文本 和 一段註釋
html ='<div class="屬性"><p>p標籤文本</p>div中文本<!--註釋代碼--></div>'
# 利用html字符串實例化BeautifulSoup對象
soup = bs4.BeautifulSoup(html,'html.parser')
# 利用.div的方式訪問節點
print(type(soup.div),'--->',soup.div)
# 利用.class的方式訪問屬性
# 打印div節點中的元素和類型
for item in soup.div:
print(type(item),'--->',item)
顯示結果:
Beautiful Soup將複雜HTML文檔轉換成一個複雜的樹形結構
每個節點都是Python對象
所有對象可以歸納爲4種
Tag , NavigableString , BeautifulSoup , Comment .
>Tag對象
html文檔中每一個標籤都會在BeautifulSoup中以Tag形式出現
Tag中可以包含其他的Tag和其他部分對象
Tag具有許多的屬性,可以用於訪問標籤或其子標籤的屬性和文本等
例如:
Tag.name返回標籤名
Tag.string返回標籤中的文本信息(Tag僅包含一個文本時,多個用strings)
Tag中的屬性通過賦值修改,會改動相應html文件中標籤
>NavigableString對象
Tag中的字符串用NavigableString對象來包裝
作爲字符串不能被直接編輯,但可以用replace()替換
在BeautifulSoup外調用需使用unicode()方法
>BeautifulSoup對象
包含一個文檔的全部內容
大多數情況下可以看作是一個大的Tag對象,支持遍歷和搜索文檔樹
>Comment 對象
Comment對象是一個特殊的NavigableString對象
用來包裝文檔中的註釋和特殊字符串等
根據需求匹配節點或信息
find和findall方法
適用對象:Tag BeautifulSoup
find會返回滿足條件的第一個節點
findall方法會以列表形式返回滿足匹配條件的所有節點
Tag.find('a',) # 返回Tag中第一個a標籤節點
Tag.find('a',class_="hello") # 返回Tag中第一個class爲"hello"的a標籤
Tag.find_all('p',text='p標籤文本')
# 返回Tag中包含(string屬性爲'p標籤文本'的NavigableString節點)的p標籤
獲取文本信息
string,strings ,text 屬性和 get_text()方法
以上方法都可以用於獲取文本
適用對象:
string 適用於bs4中的全體對象 (Tag BeautifulSoup NavigableString Comment)
strings ,text , get_text() 適用於 Tag BeautifulSoup
區別:
tag.strings返回一個生成器
可以迭代獲取tag節點及其子孫節點中所有的NavigableString節點
返回的是每一個元素類型都是NavigebleString節點
tag.string
當tag的子節點只包含一個NavigebleString節點,返回該節點
當tag只有一個子節點時,返回該子節點的string屬性的返回值
此外均返回None
tag.get_text()返回一個字符串
用於捕獲該節點的所有子孫節點中的非註釋文本(即NavigebleString節點的string返回值)
tag.text
在bs4源碼中text是接收get_text()返回值的變量
等同於tag.get_text()