Python【BeautifulSoup解析和提取網頁數據】

 【解析數據】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的屬性或者標籤都是對應的層


 

相關文章
相關標籤/搜索