5-BeautifulSoup的使用

【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 對象

遍歷文檔樹

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章