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'])