【解析數據】html
使用瀏覽器上網,瀏覽器會把服務器返回來的HTML源代碼翻譯爲咱們能看懂的樣子python
在爬蟲中,也要使用能讀懂html的工具,才能提取到想要的數據瀏覽器
【提取數據】是指把咱們須要的數據從衆多數據中挑選出來服務器
點擊右鍵-顯示網頁源代碼,在這個頁面裏去搜索會更加準確ide
安裝工具
pip install BeautifulSoup4(Mac電腦須要輸入pip3 install BeautifulSoup4)url
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++spa
解析數據翻譯
在括號中,輸入兩個參數,code
第0個參數,必須是字符串類型;
第1個參數是解析器 這裏使用用的是一個Python內置庫:html.parser
1 import requests 2
3 from bs4 import BeautifulSoup 4 #引入BS庫
5
6 res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html') 7
8 html = res.text 9
10 soup = BeautifulSoup(html,'html.parser') #把網頁解析爲BeautifulSoup對象
11
12 print(type(soup)) #查看soup的類型 soup的數據類型是 <class 'bs4.BeautifulSoup'> soup是一個BeautifulSoup對象。
13
14 print(soup) 15 # 打印soup
response.text和soup 打印出的內容如出一轍
它們屬於不一樣的類:<class 'str'> 與<class 'bs4.BeautifulSoup'> 前者是字符串,後者是已經被解析過的BeautifulSoup對象
打印出來同樣的緣由:BeautifulSoup對象在直接打印的時候會調用對象內的str方法,因此直接打印 bs 對象顯示字符串是str的返回結果
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
提取數據
find()與find_all()
是BeautifulSoup對象的兩個方法
能夠匹配html的標籤和屬性用法同樣
區別
find()只提取首個知足要求的數據
find_all()提取出的是全部知足要求的數據
1 import requests 2
3 from bs4 import BeautifulSoup 4
5 url = 'https://localprod.pandateacher.com/python-manuscript/crawler-html/spder-men0.0.html'
6
7 res = requests.get (url) 8
9 print(res.status_code) 10
11 soup = BeautifulSoup(res.text,'html.parser') 12
13 item = soup.find('div') #使用find()方法提取首個<div>元素,並放到變量item裏。
14
15 print(type(item)) #打印item的數據類型
16
17 print(item) #打印item
18
19
20 200
21
22 <class 'bs4.element.Tag'> #是一個Tag類對象
23
24 <div>你們好,我是一個塊</div>
25
26
27
28
29
30 items = soup.find_all('div') #用find_all()把全部符合要求的數據提取出來,並放在變量items裏
31
32 print(type(items)) #打印items的數據類型
33
34 print(items) #打印items
35
36
37 200
38
39 <class 'bs4.element.ResultSet'> #是一個ResultSet類的對象
40
41 [<div>你們好,我是一個塊</div>, <div>我也是一個塊</div>, <div>我仍是一個塊</div>] 42
43 #列表結構,實際上是Tag對象以列表結構儲存了起來,能夠把它當作列表來處理
soup.find('div',class_='books')
class_ 和python語法中的類 class區分,避免程序衝突
還可使用其它屬性,好比style屬性等
括號中的參數:標籤和屬性能夠任選其一,也能夠兩個一塊兒使用,這取決於咱們要在網頁中提取的內容
1 import requests # 調用requests庫
2
3 from bs4 import BeautifulSoup # 調用BeautifulSoup庫
4
5 res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html')# 返回一個Response對象,賦值給res
6
7 html= res.text# 把Response對象的內容以字符串的形式返回
8
9 soup = BeautifulSoup( html,'html.parser') # 把網頁解析爲BeautifulSoup對象
10
11 items = soup.find_all(class_='books') # 經過定位標籤和屬性提取咱們想要的數據
12
13 print(type(items)) #打印items的數據類型 #items數據類型是<class 'bs4.element.ResultSet>, 前面說過能夠把它當作列表list
14
15 #for循環遍歷列表
16
17 for item in items: 18
19 print('想找的數據都包含在這裏了:\n',item) # 打印item
20
21 print(type(item)) #<class 'bs4.element.Tag'> 是Tag對象
#####################################################################
Tag對象
find()和find_all()打印出來的東西還不是目標數據,裏面含着HTML標籤
xxxxx
items = soup.find_all(class_='books') # 經過定位標籤和屬性提取咱們想要的數據
for item in items:
print(type(item))
數據類型是<class 'bs4.element.Tag'>,是Tag對象
此時,須要用到Tag對象的三種經常使用屬性與方法
此外,提取Tag對象中的文本,用到Tag對象的另外兩種屬性——Tag.text,和Tag['屬性名']
1 import requests # 調用requests庫
2
3 from bs4 import BeautifulSoup # 調用BeautifulSoup庫
4
5 res =requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html') 6
7 # 返回一個response對象,賦值給res
8
9 html=res.text 10
11 # 把res解析爲字符串
12
13 soup = BeautifulSoup( html,'html.parser') 14
15 # 把網頁解析爲BeautifulSoup對象
16
17 items = soup.find_all(class_='books') # 經過匹配屬性class='books'提取出咱們想要的元素
18
19 for item in items: # 遍歷列表items
20
21 kind = item.find('h2') # 在列表中的每一個元素裏,匹配標籤<h2>提取出數據
22
23 title = item.find(class_='title') # 在列表中的每一個元素裏,匹配屬性class_='title'提取出數據
24
25 brief = item.find(class_='info') # 在列表中的每一個元素裏,匹配屬性class_='info'提取出數據
26
27 print(kind.text,'\n',title.text,'\n',title['href'],'\n',brief.text) # 打印書籍的類型、名字、連接和簡介的文字
##################################################################
對象的變化過程
開始用requests庫獲取數據,
到用BeautifulSoup庫來解析數據,
再繼續用BeautifulSoup庫提取數據,
不斷經歷的是咱們操做對象的類型轉換。
################################################################
提取擴展
嵌套提取好幾層:
find('ul',class_='nav').find('ul').find_all('li')
#提取我的理解:
每個find的屬性或者標籤都是對應的層