使用requests庫獲取html頁面並將其轉換成字符串以後,須要進一步解析html頁面格式,提取有用信息。html
BeautifulSoup4庫,也被成爲bs4庫(後皆採用簡寫)用於解析和處理html和xml。python
1.調用web
bs4庫中最主要的即是bs類了,每一個實例化的對象都至關於一個html頁面json
須要採用from-import導入bs類,同時經過BeautifulSoup()建立一個bs對象spa
代碼以下:3d
import requests from bs4 import BeautifulSoup r=requests.get("https://www.baidu.com/") r.encoding="utf-8" soup=BeautifulSoup(r.text) print(type(soup))
運行結果:code
2.經常使用屬性xml
建立的BeautifulSoup對象是一個樹形結構,它包含html頁面中的每個Tag(標籤)元素,能夠經過<a>.<b>的形式得到htm
常見的屬性以下:對象
head:
html頁面<head>內容
title:
html頁面標題,在<head>之中,由<title>標記
body:
html頁面<body>內容
p:
html頁面第一個<p>內容
strings:
html頁面全部呈如今web上的字符串,即標籤的內容
stripped_string:
html頁面全部呈如今web上的非空字符串
接下來嘗試爬取百度的標語「百度一下,你就知道」
首先咱們經過requests來創建請求,能夠經過查看源代碼找到對應部分
以下所示:
因此直接經過調用<title>標籤便可
代碼以下:
import requests from bs4 import BeautifulSoup r=requests.get("https://www.baidu.com/") r.encoding="utf-8" soup=BeautifulSoup(r.text) title=soup.title print(title)
結果如圖所示:
3.標籤經常使用屬性
每個標籤在bs4中也是一個對象,被稱爲tag對象,以糯米爲例,常見結構以下:
<a class=「mnav」 href="http://www.nuomi.com">糯米</a>
其中尖括號(<>)中標籤的名字爲 name,其餘項爲attrs,尖括號之間的內容爲string
因此常見的標籤屬性分爲4種
name:
字符串、標籤的名字
attrs:
字典、包含了原來頁面tag的全部屬性,好比href
contrnts:
列表、tag下全部子tag的內容
string:
字符串、tag所包含的文本,網頁中的真實文字
因爲html能夠在標籤中嵌套其餘的標籤,因此string返回遵循如下原則
①若是標籤內沒有其餘標籤,string屬性返回其中的內容
②若是標籤內部還有標籤,但只有一個標籤,string返回最裏面的標籤內容
③若是內部超過1層嵌套標籤,則返回爲none
依然以百度爲例,咱們須要找到第一個<a>標籤的string代碼應當以下:
import requests from bs4 import BeautifulSoup r=requests.get("https://www.baidu.com/") r.encoding="utf-8" soup=BeautifulSoup(r.text) print(soup.a.string)
結果如圖所示:
4.調用find()與find_all()
html中,同一個特標籤會有不少內容,好比百度首頁<a>一共有13處,但值返回第一處
因此這時候須要經過find與find_all來尋找,這兩個方法都會遍歷html文檔按照條件返回內容
使用方法以下:
BeautifulSoup.find_all(name,attrs,recursive,string,limit)
name:以標籤名字進行搜索,名字用字符串類型表示
attrs:按照標籤的屬性來搜索,須要列出屬性的名字和值,用json方法表示
recursive:設置查找層次,只查找當前標籤的西一層時使用recursiv=false
string:按照關鍵字查找string屬性內容,採用string=開始
limit:返回結果個數,默認所有
至於find()使用方法如find_all()相同,
BeautifulSoup.find_all(name,attrs,recursive,string)
區別在於find()只搜索第一個結果,find_all()返回全部結果。
咱們嘗試來經過find_all()來獲取全部含有「百度」這一關鍵詞的標籤
首先須要調用re庫,re是python的標準庫能夠採用compile()對字符串的檢索
因此代碼以下:
import requests import re from bs4 import BeautifulSoup r=requests.get("https://www.baidu.com/") r.encoding="utf-8" soup=BeautifulSoup(r.text) w=soup.find_all(string=re.compile("百度")) print(w)
結果以下: