- 基本簡介
-
BeautifulSoup簡介
bs4
-
什麼是BeautifulSoup?
BeautifulSoup,和lxml一樣,是一個html的解析器,主要功能也是解析和提取資料
-
優缺點
缺點:效率沒有lxml的效率高
優點:接口設計人性化,使用友善
-
- 安裝以及建立
-
安裝
pip install bs4
-
-
導入
from bs4 import BeautifulSoup
-
建立對象
伺服器響應的檔案生成對象
soup=BeautifulSoup(response.read().decode(),‘lxml’)
本地檔案生成對象
soup=BeautifulSoup(open(‘1.html’),‘lxml’)
注意:預設打開檔案的編碼格式為gbk是以需要指定打開編碼格式
本地練習代碼
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=edge'>
<title>Page Title</title>
<meta name='viewport' content='width=device-width, initial-scale=1'>
<link rel='stylesheet' type='text/css' media='screen' href='main.css'>
<script src='main.js'></script>
</head>
<body>
<div>
<ul>
<li id="l1">張三</li>
<li id="l2">李四</li>
<li>王五</li>
<a href="" id="" class="a1">張張張</a>
<span>hhh</span>
</ul>
</div>
<a href="" title="a2">百度</a>
<div id="d1">
<span>
hhh
</span>
</div>
<p id="p1" class='p1'>呵呵呵·</p>
</body>
</html>
from turtle import title
from bs4 import BeautifulSoup
# 通過解析本地檔案 講解bs4的基礎文法
# 加載本地檔案
soup=BeautifulSoup(open('C:/Users/86177/Desktop/tese/python/爬蟲再學/bs4.html',encoding='utf-8'),'lxml')
# 根據标簽名查找節點
print(soup.a)#找到的為第一個符合條件的節點
print(soup.a.attrs)#擷取标簽的屬性和屬性質
print(soup.a.name)#擷取值
# bs4的一些函數
# (1)find傳回第一個符合條件的資料
print(soup.find('a'))
print(soup.find('a',class_='a1'))#可以根據屬性查找對象
# (2)find_all傳回所有符合條件的資料
# 如果想擷取多個标簽的資料 那麼需要在find_all的參數中加的是清單的資料(将所查的參數放入清單中)
print(soup.find_all('a'))
print(soup.find_all(['a','span']))
print(soup.find_all('li',limit=2))#擷取前幾個資料
# (3)select(常用)
# 1. element
#select方法傳回的是一個清單 并且會傳回多個資料
print(soup.select('a'))
#2. .class
#eg:.firstname
#可以通過.代表class (稱為類選擇器)
print(soup.select('.a1'))
#3. #id
#eg:#firstname
#'#'号代表id
print(soup.select('#l1'))
#4. 屬性選擇器
#[attribute]
#eg:li=soup.select('li[class]')
#查找li标簽中有id的标簽
print(soup.select('li[id]'))
#[attribute=value]
#eg:li=soup.select('li[class='hengheng1']')
#查找到li标簽中id為l2的标簽
print(soup.select('li[id="l2"]'))
#5. 層級選擇器
#element element
#div p
#後代選擇器
#找到div下面的li
print(soup.select('div li'))
#element>element
#div>p
#子代選擇器
print(soup.select('div > ul > li'))#在bs4中不加空格也可以查到資料,有些不加空格查不到資料
#element,element
#div,p
#eg:soup=soup.select('a,span')
#找到a标簽和li标簽的所有對象
print(soup.select('a,li'))
# 4.節點資訊
# (1)擷取節點的内容:适用于标簽中嵌套标簽的結構
# obj.string
# obj.get_text()
# 兩者的差別:如果對象中隻有内容 兩者都可以擷取到,如果對象中既有内容也有标簽這時隻有get_text可以擷取到資料,string不能
# 擷取節點資訊
obj=soup.select('#d1')[0]
print(obj.string)
print(obj.get_text())
# (2)節點的屬性
# tag.name 擷取标簽名
#eg:
tag=soup.find('li')
print(tag.name)
tag.attrs将屬性值作為一個字典傳回
obj=soup.select('#p1')[0]
print(obj)
print(obj.name)#name為标簽的名字
# #将屬性名作為一個字典傳回
print(obj.attrs)
# (3)擷取節點屬性
obj.attrs.get('title')
obj.get('title')
obj['title']
# 擷取節點的屬性
obj=soup.select('#p1')[0]
print(obj.attrs.get('class'))
print(obj.get('class'))
bs4實踐小實驗《爬取星巴克菜單資料》
import urllib.request
from bs4 import BeautifulSoup
url='https://www.starbucks.com.cn/menu/'
response=urllib.request.urlopen(url)
content=response.read().decode('utf-8')
# print(content)
soup=BeautifulSoup(content,'lxml')
name_list=soup.select('ul[class="grid padded-3 product"] strong')
for i in name_list:
print(i.string)