python-變數&底層儲存原理
阿新 • • 發佈:2021-11-02
1.BeautifulSoup簡稱:bs4
2.BeautifulSoup,和lxml一樣,是一個html的解析器,主要功能也是解析和提取資料
3.優缺點?缺點:效率沒有lxml的效率高。優點:介面設計人性化,使用方便
安裝以及建立
1.安裝
pip install bs4
2.匯入
from bs4 import BeautifulSoup
3.建立物件
伺服器響應的檔案生成物件
soup = BeautifulSoup(response.read().decode(), 'lxml')
本地檔案生成物件
soup = BeautifulSoup(open('1.html'), 'lxml')
注意:預設開啟檔案的編碼格式gbk所以需要指定開啟編碼格式
節點定位
1.根據標籤名查詢節點
soup.a 【注】只能找到第一個a
soup.a.name
soup.a.attrs
2.函式
(1).find(返回一個物件)
find('a'):只找到第一個a標籤
find('a', title='名字')
find('a', class_='名字')
(2).find_all(返回一個列表)
find_all('a') 查詢到所有的a
find_all(['a', 'span']) 返回所有的a和span
find_all('a', limit=2) 只找前兩個a
(3).select(根據選擇器得到節點物件)【推薦】
1.element
eg:p
2..class
eg:.firstname
3.#id
eg:#firstname
4.屬性選擇器
[attribute]
eg:li = soup.select('li[class]')
[attribute=value]
eg:li = soup.select('li[class="hengheng1"]')
5.層級選擇器
element element
div p
element>element
div>p
element,element
div,p
eg:soup = soup.select('a,span')
節點資訊
(1).獲取節點內容:適用於標籤中巢狀標籤的結構
obj.string
obj.get_text()【推薦】
(2).節點的屬性
tag.name 獲取標籤名
eg:tag = find('li)
print(tag.name)
tag.attrs將屬性值作為一個字典返回
(3).獲取節點屬性
obj.attrs.get('title')【常用】
obj.get('title')
obj['title']
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>bs4基本使用</title> </head> <body> <div> <ul> <li id="l1">張三</li> <li id="l2">李四</li> <li>王五</li> <a href="" id="" class="a1">嚶嚶嚶</a> <span>嘿嘿嘿</span> </ul> </div> <a href="" title="a2">百度</a> <div id="d1"> <span> 哈哈哈 </span> </div> <p id="p1"class="p1">呵呵呵</p> </body> </html>
from bs4 import BeautifulSoup # 通過解析本地檔案 來將bs4的基礎語法進行講解 # 預設開啟的檔案的編碼格式是gbk 所以在開啟檔案的時候需要指定編碼 soup = BeautifulSoup(open('bs4的基本使用.html',encoding='utf-8'),'lxml') # 根據標籤名查詢節點 # 找到的是第一個符合條件的資料 # print(soup.a) # 獲取標籤的屬性和屬性值 # print(soup.a.attrs) # bs4的一些函式
# (1)find
# 返回的是第一個符合條件的資料 # print(soup.find('a')) # 根據title的值來找到對應的標籤物件 # print(soup.find('a',title="a2")) # 根據class的值來找到對應的標籤物件 注意的是class需要新增下劃線 # print(soup.find('a',class_="a1"))
# (2)find_all 返回的是一個列表 並且返回了所有的a標籤
# print(soup.find_all('a')) # 如果想獲取的是多個標籤的資料 那麼需要在find_all的引數中新增的是列表的資料 # print(soup.find_all(['a','span'])) # limit的作用是查詢前幾個資料,limit=2前兩個 # print(soup.find_all('li',limit=2))
# (3)select(推薦) # select方法返回的是一個列表 並且會返回多個數據 # print(soup.select('a')) # 可以通過.代表class 我們把這種操作叫做類選擇器 # print(soup.select('.a1')) # print(soup.select('#l1'))
# 屬性選擇器---通過屬性來尋找對應的標籤 # 查詢到li標籤中有id的標籤 # print(soup.select('li[id]')) # 查詢到li標籤中id為l2的標籤 # print(soup.select('li[id="l2"]'))
# 層級選擇器 # 後代選擇器 # 找到的是div下面的li # print(soup.select('div li'))
# 子代選擇器 # 某標籤的第一級子標籤 # 注意:很多的計算機程式語言中 如果不加空格不會輸出內容 但是在bs4中 不會報錯 會顯示內容 # print(soup.select('div > ul > li')) # 找到a標籤和li標籤的所有的物件 # print(soup.select('a,li'))
# 節點資訊 # 獲取節點內容 # obj = soup.select('#d1')[0] # 如果標籤物件中 只有內容 那麼string和get_text()都可以使用 # 如果標籤物件中 除了內容還有標籤 那麼string就獲取不到資料 而get_text()是可以獲取資料 # 我們一般情況下 推薦使用get_text() # print(obj.string) # print(obj.get_text()) # 節點的屬性 # obj = soup.select('#p1')[0] # name是標籤的名字 # print(obj.name) # 將屬性值左右一個字典返回 # print(obj.attrs) # 獲取節點的屬性 obj = soup.select('#p1')[0] print(obj.attrs.get('class')) print(obj.get('class')) print(obj['class'])