【Python3網絡爬蟲】5-BeautifulSoup的使用
簡介
BeautifulSoup最主要的功能是從網頁抓取數據,Beautiful Soup自動將輸入文檔轉換爲Unicode編碼,輸出文檔轉換爲utf-8編碼。BeautifulSoup支持Python標準庫中的HTML解析器,還支持一些第三方的解析器,如果我們不安裝它,則 Python 會使用 Python默認的解析器,lxml 解析器更加強大,速度更快,推薦使用lxml 解析器。
安裝
pip3 install beautifulsoup4
BeautifulSoup4主要解析器,以及優缺點:
解析器 | 使用方法 | 優勢 | 劣勢 |
---|---|---|---|
Python標準庫 | BeautifulSoup(markup, “html.parser”) | Python的內置標準庫執行速度適中文檔容錯能力強 | Python 2.7.3 or 3.2.2)前 的版本中文檔容錯能力差 |
lxml HTML 解析器 | BeautifulSoup(markup, “lxml”) | 速度快文檔容錯能力強 | 需要安裝C語言庫 |
lxml XML 解析器 | BeautifulSoup(markup, [“lxml”, “xml”])BeautifulSoup(markup, “xml”) | 速度快唯一支持XML的解析器 | 需要安裝C語言庫 |
html5lib | BeautifulSoup(markup, “html5lib”) | 最好的容錯性以瀏覽器的方式解析文檔生成HTML5格式的文檔 | 速度慢不依賴外部擴展 |
注意:
lxml 和html5lib需要安裝
pip install lxml pip install html5lib
BeautifulSoup4簡單使用
import bs4
import requests
from fake_useragent import UserAgent
url = 'https://www.qiushibaike.com/text/page/{}/'
headers = {
'User-Agent': UserAgent().chrome
}
def get_data(page):
print("正在爬取第{}頁".format(page))
response = requests.get(url.format(page), headers=headers)
return response.text
text = get_data(1)
bs = bs4.BeautifulSoup(text, "html.parser")
# 格式化html結構
print(bs.prettify())
# 獲取title標籤的名稱
print(bs.title)
# 獲取title的name
print(bs.title.name)
# 獲取title標籤的內容
print(bs.title.string)
# 獲取head標籤的所有內容
print(bs.head)
# 獲取第一個div標籤中的所有內容
print(bs.div)
# 獲取第一個div標籤的id的值
print(bs.div["id"])
print(bs.a)
# 獲取所有的a標籤
print(bs.find_all("a"))
# 獲取id="u1"
print(bs.find(id="u1"))
# 獲取所有的a標籤,並遍歷打印a標籤中的href的值
for item in bs.find_all("a"):
print(item.get("href"))
# 獲取所有的a標籤,並遍歷打印a標籤中的內容
for item in bs.find_all("a"):
print(item.get_text())
BeautifulSoup4四大對象種類
BeautifulSoup4將複雜HTML文檔轉換成一個複雜的樹形結構,每個節點都是Python對象,所有對象可以歸納爲4種:
- Tag
- NavigableString
- BeautifulSoup
- Comment
Tag
簡而言之,就是html的一個個標籤
我們可以利用 soup 加標籤名輕鬆地獲取這些標籤的內容,這些對象的類型是bs4.element.Tag。但是注意,它查找的是在所有內容中的第一個符合要求的標籤。
對於 Tag,它有兩個重要的屬性,是 name 和 attrs:
# 獲取title標籤的名稱
print(bs.title)
# 獲取title的name
print(bs.title.name)
# 獲取title標籤的內容
print(bs.title.string)
# 獲取head標籤的所有內容
print(bs.head)
from bs4 import BeautifulSoup
file = open('./aa.html', 'rb')
html = file.read()
bs = BeautifulSoup(html,"html.parser")
# [document] #bs 對象本身比較特殊,它的 name 即爲 [document]
print(bs.name)
# head #對於其他內部標籤,輸出的值便爲標籤本身的名稱
print(bs.head.name)
# 在這裏,我們把 a 標籤的所有屬性打印輸出了出來,得到的類型是一個字典。
print(bs.a.attrs)
#還可以利用get方法,傳入屬性的名稱,二者是等價的
print(bs.a['class']) # 等價 bs.a.get('class')
# 可以對這些屬性和內容等等進行修改
bs.a['class'] = "newClass"
print(bs.a)
# 還可以對這個屬性進行刪除
del bs.a['class']
print(bs.a)
NavigableString
既然我們已經得到了標籤的內容,那麼問題來了,我們要想獲取標籤內部的文字怎麼辦呢?很簡單,用 .string 即可
BeautifulSoup
BeautifulSoup對象表示的是一個文檔的內容
Comment
Comment 對象是一個特殊類型的 NavigableString 對象